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

2021. 3. 26. 01:04 Spring Data/Spring Data JPA

 

| Spring JPA 쿼리 메서드

 

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

 

1. 리포지터리 메서드

2. @NamdeQuery

3. @Query

 

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

 

| Spring JPA 쿼리 메서드 예제

 

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

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

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



출처: https://engkimbs.tistory.com/833?category=772527 [새로비]