아카이브

[스프링 데이터 JPA] 스프링 데이터 JPA 3. 쿼리 메서드 본문

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);
    }