스프링 데이터 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);
}