Spring/스프링 데이터 JPA
[스프링 데이터 JPA] 스프링 데이터 JPA 3. 쿼리 메서드
주멘이
2021. 1. 16. 22:55
이전과 마찬가지로 Pageable이나 Sort를 매개변수로 사용할 수 있는데, @Query와 같이 사용할 때 제약 사항이 하나 있습니다.
Order by 절에서 함수를 호출하는 경우에는 Sort를 사용하지 못합니다. 그 경우에는 JpaSort.unsafe()를 사용해야 합니다.
- Sort는 그 안에서 사용한 프로퍼티 또는 alias 가 엔티티에 없는 경우에는 예외가 발생합니다.
- JpaSort.unsafe()를 사용하면 함수 호출을 할 수 있습니다.
PostRepository
/**
* Alias 줄 수 있음
*
* @Query("SELECT p, p.title AS pTitle FROM Post AS p WHERE p.title = ?1")
*/
@Query("SELECT p FROM Post AS p WHERE p.title = ?1")
List<Post> findByTitle(String title, Sort sort);
테스트 코드
@Test
@DisplayName("@Query Sort 테스트")
public void findByTitleQuerySort() {
savePost();
List<Post> byTitle = postRepository.findByTitle("Spring Data Jpa", Sort.by("title")); // property, alias 아니라면 error
assertThat(byTitle.size()).isEqualTo(1);
}
@Test
@DisplayName("@Query Sort Jpa.unsafe() 테스트")
public void findByTitleQuerySortJpaUnsafe() {
savePost();
List<Post> byTitle = postRepository.findByTitle("Spring Data Jpa", JpaSort.unsafe("LENGTH(title)"));
assertThat(byTitle.size()).isEqualTo(1);
}