스프링 데이터 JPA-17.쿼리 메소드, Sort


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

쿼리 생성하기

  • https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
  • And, Or
  • Is, Equals
  • LessThan, LessThanEqual, GreaterThan, GreaterThanEqual
  • After, Before
  • IsNull, IsNotNull, NotNull
  • Like, NotLike
  • StartingWith, EndingWith, Containing
  • OrderBy
  • Not, In, NotIn
  • True, False
  • IgnoreCase

쿼리 찾아쓰기

  • 엔티티에 정의한 쿼리 찾아 사용하기 JPA Named 쿼리
    • @NamedQuery
    • @NamedNativeQuery
  • 리포지토리 메소드에 정의한 쿼리 사용하기
    • @Query
    • @Query(nativeQuery=true)
@Entity @Getter @Setter
@NamedQuery(name = "Post.findByTitle", query = "SELECT p FROM Post as p WHERE p.title = ?1")
//@NamedNativeQuery() 네이티브 쿼리도 사용 가능
public class Post extends AbstractAggregateRoot<Post> {
public interface PostRepository extends JpaRepository<Post, Long> {

    List<Post> findByTitleStartingWith(String title);
    List<Post> findByTitle(String title);

}

또는 레포지토리에 선언해줘도 된다. (엔티티에 NamedQuery 지우고)

public interface PostRepository extends JpaRepository<Post, Long> {

    List<Post> findByTitleStartingWith(String title);

    @Query("SELECT p FROM Post as p WHERE p.title = ?1")
    List<Post> findByTitle(String title);

}

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

이전과 마찬가지로 Pageable이나 Sort를 매개변수로 사용할 수 있는데, @Query와 같이 사용할 때 제약 사항이 하나 있습니다.

Order by 절에서 함수를 호출하는 경우에는 Sort를 사용하지 못합니다. 그 경우에는 JpaSort.unsafe()를 사용 해야 합니다.

  • Sort는 그 안에서 사용한 프로퍼티 또는 alias가 엔티티에 없는 경우에는 예외가 발생합니다.
  • JpaSort.unsafe()를 사용하면 함수 호출을 할 수 있습니다.
    • JpaSort.unsafe(“LENGTH(firstname)”);
public interface PostRepository extends JpaRepository<Post, Long> {

    List<Post> findByTitleStartingWith(String title);

    @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> all = postRepository.findByTitle("spring start jpa", Sort.by("title"));
        List<Post> all = postRepository.findByTitle("spring start jpa", JpaSort.unsafe("LENGTH(title)"));
        assertEquals(all.size(), 1);
    }





© 2019. by jaeuk