스프링 데이터 JPA 4. Sort - KwangtaekJung/inflearn-spring-data-jpa-keesun GitHub Wiki

스프링 데이터 JPA: 쿼리 메소드 Sort

이전과 마찬가지로 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)"));
⚠️ **GitHub.com Fallback** ⚠️