SpringData JPA를 사용하여 날짜 및 시간별로 항목 쿼리

1. 소개

이 빠른 자습서에서는 SpringData JPA를 사용하여 날짜별로 항목을 쿼리하는 방법을 알아 봅니다.

먼저 JPA로 날짜와 시간을 매핑하는 방법에 대한 기억을 새로 고칠 것입니다.

그런 다음 날짜 및 시간 필드가있는 엔터티와 해당 엔터티를 쿼리하는 Spring 데이터 저장소를 만듭니다.

2. JPA로 날짜 및 시간 매핑

우선, JPA로 날짜를 매핑하는 것에 대한 약간의 이론을 검토 할 것 입니다. 알아야 할 것은 다음을 대표할지 여부를 결정해야한다는 것입니다.

  • 데이트 만
  • 시간 만
  • 아니면 둘다

(선택 사항) @Column 주석 외에도 필드가 나타내는 내용을 지정하기 위해 @Temporal 주석을 추가해야합니다 .

이 주석은 TemporalType enum 값인 매개 변수를 사용합니다 .

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

JPA를 사용한 날짜 및 시간 매핑에 대한 자세한 기사는 여기에서 찾을 수 있습니다.

3. 실제로

실제로 엔터티가 올바르게 설정되면 SpringData JPA를 사용하여 쿼리 할 작업이 많지 않습니다. 쿼리 메서드 인 @Query 주석 만 사용 하면 됩니다.

모든 SpringData JPA 메커니즘은 잘 작동합니다 .

SpringData 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. 엔터티 쿼리

이제 엔터티가 모두 설정 되었으므로 해당 기사를 쿼리 할 SpringData 저장소 를 만들어 보겠습니다 .

몇 가지 SpringData 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 지정된 날짜와 시간 전에 작성된 기사를 검색

두 개의 첫 번째 메소드는 SpringData 쿼리 메소드 메커니즘 에 의존 하고 마지막은 @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. 결론

이 짧은 기사에서는 SpringData JPA로 날짜 및 시간 필드를 사용하여 엔티티를 쿼리하는 방법을 살펴 보았습니다.

스프링 데이터 메커니즘을 사용하여 엔티티를 쿼리하기 전에 약간의 이론을 배웠습니다. 우리는 이러한 메커니즘이 다른 유형의 데이터와 마찬가지로 날짜 및 시간에 대해 동일한 방식으로 작동하는 것을 확인했습니다.

이 기사의 소스 코드는 GitHub에서 사용할 수 있습니다.