1. 소개

 
이 빠른 사용방법(예제)에서는 Spring Data JPA를 사용하여 날짜별로 엔터티를 쿼리하는 방법을 살펴봅니다.먼저 JPA로 날짜와 시간을 매핑하는 방법에 대한 기억을 새로 고칩니다. 그런 다음 날짜 및 시간 필드가 있는 엔터티와 이러한 엔터티를 쿼리할 Spring Data 저장소를 만듭니다.

2. JPA로 날짜 및 시간 매핑

 
시작하기 위해

JPA로 날짜 매핑에 대한 약간의 이론을 검토할 것

입니다. 알아야 할 것은 다음을 나타낼지 여부를 결정해야 한다는 것입니다.
  • 데이트만
  • 한 번만
  • 아니면 둘다
(선택 사항) 

@Column

어노테이션에 추가  하여 필드가 나타내는 것을 지정하기 위해

@Temporal

어노테이션을 추가해야 합니다  .이 어노테이션은

TemporalType enum 값인 매개변수를 사용합니다.

  • 임시 유형.DATE
  • 임시 유형.TIME
  • 임시 유형.TIMESTAMP
JPA를 사용한 날짜 및 시간 매핑에 대한 자세한 기사는

여기

에서 찾을 수 있습니다 .

3. 예제

 
실제로 엔터티가 올바르게 설정되면 Spring Data JPA를 사용하여 엔터티를 쿼리하기 위해 할 일이 많지 않습니다.

쿼리 메서드

@Query

어노테이션 을 사용하기만  하면 됩니다.

모든 Spring Data 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

리포지토리 를 생성해 보겠습니다.

여러 Spring Data JPA 기능을 사용하여 세 가지 메서드를 생성합니다.
public interface ArticleRepository 
  extends JpaRepository<Article, Integer> {

    List<Article> findAllByPublicationDate(Date publicationDate);

    List<Article> findAllByPublicationTimeBetween(
      Date publicationTimeStart,
      Date publicationTimeEnd);

    @Query("select a from Article a where a.creationDateTime <= :creationDateTime")
    List<Article> findAllWithCreationDateTimeBefore(
      @Param("creationDateTime") Date creationDateTime);

}
그래서 우리는 세 가지 방법을 정의했습니다.
  • 지정된 날짜에 게시된 기사를 검색하는 findAllByPublicationDate
  •  주어진 두 시간 사이에 게시된 기사를 검색하는 findAllByPublicationTimeBetween
  • 주어진 날짜와 시간 이전에 작성된 기사를 검색 하는  findAllWithCreationDateTimeBefore

처음 두 메서드는 Spring Data의 쿼리 메서드

메커니즘 에 의존 하고 마지막 두 메서드는

@Query

어노테이션에 의존합니다.
결국 날짜가 처리되는 방식은 변경되지 않습니다.

첫 번째 방법은 매개변수의 날짜 부분만 고려합니다.

두 번째는 매개변수의 시간만 고려합니다. 마지막은 날짜와 시간을 모두 사용합니다.

3.3. 쿼리 테스트

 
마지막으로 할 일은 이러한 쿼리가 예상대로 작동하는지 확인하기 위해 몇 가지 테스트를 설정하는 것입니다.먼저 데이터를 데이터베이스로 가져온 다음 리포지토리의 각 메서드를 검사하는 테스트 클래스를 만듭니다.
@RunWith(SpringRunner.class)
@DataJpaTest
public class ArticleRepositoryIntegrationTest {

    @Autowired
    private ArticleRepository repository;

    @Test
    public void whenFindByPublicationDate_thenArticles1And2Returned() {
        List<Article> 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<Article> 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<Article> 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에서

사용할 수 있습니다 .
Persistence footer banner