springframework/Spring Data JPA

Spring Data Common : 쿼리 작성 키워드

Jungsoomin :) 2020. 11. 15. 21:59

쿼리 작성 방법 전략은 3개가 있다.

  • 메서드 이름 분석 방법 : Spring Data JPA 가 쿼리를 작성
  • 메서드 부가정보 분석 방법 : JPQL 사용, Native Query 사용시 @Query 어노테이션 속성에 nativeQuery=true
  • 정의한 쿼리를 찾아보고 없다면 메서드 이름 분석 : DEFAULT 값, @EnableJpaRepositories 의 queryLookupStrategy 속성에 상수로 지정
// 메서드 이름 분석
public interface CommentRepository  extends  MyRepository<Comment, Long>{
    List<Comment> findByCommentContains(String keyword);
}

// 부가정보 분석
public interface CommentRepository  extends  MyRepository<Comment, Long>{

    @Query("SELECT C FROM COMMENT AS C")
    @Query(value = "SELECT * FROM COMMENT",nativeQuery =true )
    List<Comment> findAll();
 }

@EnableJpaRepositories 의 queryLookupStrategy 속성 전략

  • CREATE : 메서드 이름 분석 
  • USE_DECLARED_QUERY : 메서드 부가정보 분석
  • CREATE_IF_NOT_FOUND : DEFAULT 값 
@SpringBootApplication
@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
@Import(SoominRegistrar.class)
public class DatajpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(DatajpaApplication.class, args);
    }

}

쿼리를 찾는 방법

저장소 마다 다르나 Spring Data JPA@Query, @Procedure, @NamedQuery 순이다.

 


쿼리를 만드는 방법

  • 리턴타입(컬렉션,도메인,Optional, Page, Slice...)
  • 접두어 : find, get, query, count, delete, remove ...
  • 도입부 : Distinct, First, Top ..
  • By
  • 프로퍼티 : 엔티티가 참조하는 엔티티의 프로퍼티는 _ 를 사용
  • 조건식 : 대소문자구분안함, 범위, 대소 구분, 포함여부 등
  • 정렬조건 : OrderBy프로퍼티Asc|Desc
  • 매개 변수 : Sort, Pageable( Pageable 은 Sorting 기능까지 포함하고 있으니 참고)


매개값에 Pageable 을 주어도 List<T> 로 받을 수 있으나 Page 도메인이 제공하는 메서드는 사용할 수 없다.

public interface CommentRepository  extends  MyRepository<Comment, Long>{

    List<Comment> findByCommentContains(String keyword);

    List<Comment> findDistinctById(Long id, Pageable pageable); //중복제거
    
 }

메서드 작성시 사고의 흐름

  • 테스트 코드 작성으로 원하는 쿼리가 작성되는지 확인해야함 ( Spring Data 가 쿼리를 만들 수 없는 경우 Bean을 만들때 부터 에러가 나게 됨 )
  • 에러가 없을 경우 테스트코드를 실행하여 생성한 쿼리와 결과 값이 알맞는지 확인