스프링 데이터 JPA 4. Sort - KwangtaekJung/inflearn-spring-data-jpa-keesun GitHub Wiki
이전과 마찬가지로 Pageable이나 Sort를 매개변수로 사용할 수 있는데, @Query와 같이 사용할 때 제약 사항이 하나 있습니다.
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("SELECT p FROM Post AS p WHERE p.title = ?1")
List<Post> findByTitle(String title, Sort sort);
}
@Test
public void findByTitle() {
savePost();
List<Post> posts = postRepository.findByTitle("Spring Data JPA", Sort.by("title"));
Assertions.assertThat(posts.size()).isEqualTo(1);
}
Hibernate:
select
post0_.id as id1_1_,
post0_.created as created2_1_,
post0_.title as title3_1_
from
post post0_
where
post0_.title=?
order by
post0_.title as
Order by 절에서 함수를 호출하는 경우에는 Sort를 사용하지 못합니다. 그 경우에는 JpaSort.unsafe()를 사용 해야 합니다.
- Sort는 그 안에서 사용한 프로퍼티 또는 alias가 엔티티에 없는 경우에는 예외가 발생합니다.
List<Post> posts = postRepository.findByTitle("Spring Data JPA", Sort.by("LENGTH(title)"));
org.springframework.data.mapping.PropertyReferenceException: No property LENGTH(title) found for type Post!
- JpaSort.unsafe()를 사용하면 함수 호출을 할 수 있습니다.
- JpaSort.unsafe(“LENGTH(firstname)”);
List<Post> posts = postRepository.findByTitle("Spring Data JPA", JpaSort.unsafe("LENGTH(title)"));