Запрос объектов по датам и временам с помощью Spring Data JPA

Запрашивать объекты по датам и временам с помощью Spring Data JPA

1. Вступление

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

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

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

2. Отображение дат и времени с JPA

Для началаwe’ll review a bit of theory about mapping dates with JPA. Важно знать, что нам нужно решить, хотим ли мы представлять:

  • Только свидание

  • Только время

  • Или оба

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

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

  • TemporalType.DATE

  • TemporalType.TIME

  • TemporalType.TIMESTAMP

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

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

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

Every Spring Data JPA mechanism will work just fine.

Давайте посмотрим на пару примеров объектов, запрошенных по дате и времени с помощью 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 Datarepository для запроса этих статей.

Мы создадим три метода, используя несколько функций 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); }

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

  • findAllByPublicationDate, который извлекает статьи, опубликованные в заданную дату

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

  • иfindAllWithCreationDateTimeBefore, который извлекает статьи, созданные до заданной даты и времени.

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

В конце концов, это не меняет способа обработки дат. The first method will only consider the date part of the parameter.с

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

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 Data для запроса сущностей. Мы видели, что эти механизмы работают с датами и временем так же, как и с другими типами данных.

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