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() { Listresult = 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 .