1. 소개
2. JPA로 날짜 및 시간 매핑
JPA로 날짜 매핑에 대한 약간의 이론을 검토할 것
입니다. 알아야 할 것은 다음을 나타낼지 여부를 결정해야 한다는 것입니다.- 데이트만
- 한 번만
- 아니면 둘다
@Column
어노테이션에 추가 하여 필드가 나타내는 것을 지정하기 위해@Temporal
어노테이션을 추가해야 합니다 .이 어노테이션은TemporalType enum 값인 매개변수를 사용합니다.
- 임시 유형.DATE
- 임시 유형.TIME
- 임시 유형.TIMESTAMP
3. 예제
쿼리 메서드
나@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 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));
}
}
각 테스트는 조건과 일치하는 기사만 검색되는지 확인합니다.