Рубрики
Без рубрики

Запрос сущностей по датам и времени с помощью Spring Data JPA

Узнайте, как запрашивать сущности, используя их поля даты и времени с помощью Spring Data JPA.

Автор оригинала: baeldung.

1. введение

В этом кратком руководстве мы увидим, как запрашивать сущности по датам с помощью Spring Data JPA.

Сначала мы освежим нашу память о том, как сопоставлять даты и время с помощью JPA.

Затем мы создадим объект с полями даты и времени, а также хранилище данных Spring для запроса этих объектов.

2. Сопоставление дат и времени с JPA

Для начала, мы рассмотрим немного теории о сопоставлении дат с JPA . Важно знать, что нам нужно решить, хотим ли мы представлять:

  • Только свидание
  • Только время
  • Или и то и другое

В дополнение к (необязательной) аннотации @Column нам нужно будет добавить аннотацию @Temporal , чтобы указать, что представляет поле.

Эта аннотация принимает параметр, который является значением перечисления TemporalType :

  • Эта аннотация принимает параметр, который является значением перечисления
  • TemporalType
  • :

Подробную статью о сопоставлении дат и времени с JPA можно найти здесь .

3. На практике

На практике, как только наши сущности правильно настроены, нет большой работы, чтобы запросить их с помощью Spring Data JPA. Нам просто нужно использовать методы query, @Query аннотации.

Каждую весну механизм JPA данных будет работать просто отлично .

Давайте рассмотрим несколько примеров сущностей, запрашиваемых по датам и времени с помощью Spring Data JPA.

3.1. Создание организации

Для начала предположим, что у нас есть объект Article с датой публикации, временем публикации и датой и временем создания:

@Entity
public class Article {

    @Id
    @GeneratedValue
    Integer id;
 
    @Temporal(TemporalType.DATE)
    Date publicationDate;
 
    @Temporal(TemporalType.TIME)
    Date publicationTime;
 
    @Temporal(TemporalType.TIMESTAMP)
    Date creationDateTime;
}

Для демонстрации мы разделили дату и время публикации на два поля. Таким образом, представлены три временных типа.

3.2. Запрос сущностей

Теперь, когда наша сущность полностью настроена, давайте создадим Spring Data repository для запроса этих статей.

Мы создадим три метода, используя несколько функций Spring Data JPA:

public interface ArticleRepository 
  extends JpaRepository {

    List
findAllByPublicationDate(Date publicationDate); List
findAllByPublicationTimeBetween( Date publicationTimeStart, Date publicationTimeEnd); @Query("select a from Article a where a.creationDateTime <= :creationDateTime") List
findAllWithCreationDateTimeBefore( @Param("creationDateTime") Date creationDateTime); }

Итак, мы определили три метода:

  • найти все по дате публикации который извлекает статьи, опубликованные на заданную дату
  • найти Все по времени публикации Между , который извлекает статьи, опубликованные между двумя заданными часами
  • и найти все с CreationDateTime До который извлекает статьи, созданные до заданной даты и времени

Два первых метода основаны на механизме Spring Data query methods , а последний-на аннотации @Query .

В конце концов, это не меняет того, как будут обрабатываться даты. Первый метод будет учитывать только часть параметра date.

Второй будет учитывать только время параметров. И последний будет использовать как дату, так и время.

3.3. Тестирование запросов

Последнее, что нам нужно сделать, – это настроить некоторые тесты, чтобы проверить, работают ли эти запросы должным образом.

Сначала мы импортируем несколько данных в нашу базу данных, а затем создадим тестовый класс, который будет проверять каждый метод репозитория:

@RunWith(SpringRunner.class)
@DataJpaTest
public class ArticleRepositoryIntegrationTest {

    @Autowired
    private ArticleRepository repository;

    @Test
    public void whenFindByPublicationDate_thenArticles1And2Returned() {
        List
result = repository.findAllByPublicationDate( new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01")); assertEquals(2, result.size()); assertTrue(result.stream() .map(Article::getId) .allMatch(id -> Arrays.asList(1, 2).contains(id))); } @Test public void whenFindByPublicationTimeBetween_thenArticles2And3Returned() { List
result = repository.findAllByPublicationTimeBetween( new SimpleDateFormat("HH:mm").parse("15:15"), new SimpleDateFormat("HH:mm").parse("16:30")); assertEquals(2, result.size()); assertTrue(result.stream() .map(Article::getId) .allMatch(id -> Arrays.asList(2, 3).contains(id))); } @Test public void givenArticlesWhenFindWithCreationDateThenArticles2And3Returned() { List
result = repository.findAllWithCreationDateTimeBefore( new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00")); assertEquals(2, result.size()); assertTrue(result.stream() .map(Article::getId) .allMatch(id -> Arrays.asList(2, 3).contains(id)); } }

Каждый тест проверяет, что извлекаются только статьи, соответствующие условиям.

4. Заключение

В этой короткой статье мы рассмотрели, как запрашивать сущности, используя их поля даты и времени с помощью Spring Data JPA.

Мы немного изучили теорию, прежде чем использовать механизмы данных Spring для запроса сущностей. Мы видели, что эти механизмы работают с датами и временем так же, как и с другими типами данных.

Исходный код этой статьи доступен на GitHub .