[Spring JPA #21] Spring JPA 쿼리 메서드 및 정렬

| Spring JPA 쿼리 메서드


Spring JPA에서 DB에 쿼리를 날릴 때 사용할 수 있는 방법은 크게 3가지가 있습니다.


1. 리포지터리 메서드

2. @NamdeQuery

3. @Query


[Spring/Spring JPA] - [Spring JPA #13] 스프링 데이터 쿼리 만들기



| Spring JPA 쿼리 메서드 예제


Repository 인터페이스에 메서드명으로 어떤 쿼리를 날릴 지 정할 수 있습니다.

public interface PostRepository extends JpaRepository<Post, Long> {

List<Post> findByTitleStartsWith(String title);
}

"Title이 현재 들어온 인자값으로 시작하는 엔티티를 찾아라"라는 의미의 쿼리 메서드입니다.


다음과 같이 도메인 클래스에 @NamedQuery 어노테이션을 붙여서 JPQL을 사용하여 쿼리를 지정할 수 있습니다. 만일 Native 쿼리를 사용하고 싶다면 @NamedNativeQuery 어노테이션을 붙여서 사용할 수 있습니다.

@Entity
@Data
@NamedQuery(name = "Post.findByTitle", query="SELECT p FROM Post AS p WHERE p.title = ?1")
public class Post {

@Id @GeneratedValue
private Long id;

private String title;

@Temporal(TemporalType.TIMESTAMP)
private Date created;
}


Repository 인터페이스에 @Query 어노테이션을 붙여서 사용할 수 있습니다. 만일 Native 쿼리를 사용하고자 하면 @Query(nativeQuery=true) 정보를 추가하면 됩니다.

public interface PostRepository extends JpaRepository<Post, Long> {

List<Post> findByTitleStartsWith(String title);

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


| Spring JPA 쿼리 메서드 정렬

public interface PostRepository extends JpaRepository<Post, Long> {

List<Post> findByTitleStartsWith(String title);

@Query("SELECT p FROM Post as p where p.title = ?1")
List<Post> findByTitle(String title, Sort sort);
}

@Query 안에 있는 쿼리를 정렬하기 위해서는 Sort 클래스 형태로 Sort 정보를 넘겨줘야합니다. 여기서 sort에 넘겨줘야하는 정보는 도메인 클래스의 Property 혹은 alais 여야 합니다.

List<Post> all = postRepositry.findByTitle("Spring", Sort.by("title"));


만일 LENGTH(title)과 같이 기본적으로 위와 같은 정렬 정보가 아닌 다른 특수한 기준으로 정렬을 하고자 할 때는 다음과 같이 JpaSort.unsafe 메서드를 추가하여 사용할 수 있습니다.

all = postRepositry.findByTitle("Spring", JpaSort.unsafe("LENGTH(title)"));


https://www.inflearn.com/course/스프링-데이터-jpa


이 글을 공유하기

댓글(0)

Designed by JB FACTORY