Заявявайте обекти по дати и времена с Spring Data JPA

1. Въведение

В този бърз урок ще видим как да заявяваме обекти по дати с Spring Data JPA.

Първо ще освежим паметта си за това как да картографираме дати и часове с JPA.

След това ще създадем обект с полета за дата и час, както и хранилище за пролетни данни за заявки към тези обекти.

2. Картиране на дати и часове с JPA

За начало ще разгледаме малко теория за картографирането на датите с JPA . Трябва да се знае, че трябва да решим дали искаме да представяме:

  • Само среща
  • Само време
  • Или и двете

В допълнение към (по избор) анотация @Column , ще трябва да добавим анотацията @Temporal, за да посочим какво представлява полето.

Тази анотация приема параметър, който е стойност на TemuralType enum :

  • TemporalType.DATE
  • TemporalType.TIME
  • TemporalType.TIMESTAMP

Подробна статия за картографиране на дати и часове с JPA можете да намерите тук.

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

На практика, след като нашите обекти са правилно настроени, няма много работа за извършване на заявки с тях чрез Spring Data JPA. Просто трябва да използваме методи за заявки, анотация @Query .

Всеки механизъм JPA Spring Data ще работи добре .

Нека да видим няколко примера за обекти, заявени по дати и часове с Spring Data JPA.

3.1. Настройте обект

Като начало, да речем, че имаме член на член с дата на публикуване, час на публикуване и дата и час на създаване:

@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, за да заявяваме тези статии.

Ще създадем три метода, като използваме няколко функции 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, който извлича статии, публикувани на определена дата
  • findAllByPublicationTimeBet Between, която извлича статии, публикувани между два зададени часа
  • и findAllWithCreationDateTimeBefore, който извлича статии, създадени преди определена дата и час

Двата първи метода разчитат на механизма на методите за заявки Spring Data , а последният на анотацията @Query .

В крайна сметка това не променя начина на третиране на датите. Първият метод ще разгледа само датната част на параметъра.

Вторият ще отчита само времето на параметрите. И последният ще използва както дата, така и час.

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 механизми за заявки на обектите. Видяхме, че тези механизми работят по същия начин с датите и часовете, както и с други видове данни.

Изходният код за тази статия е достъпен в GitHub.