쿼리를 만드는 방법은 크게 3가지가 있다.
스프링 데이터 JPA가 메서드 이름을 분석해서 자동으로 쿼리를 만들어준다.
예를 들면 아래같은 경우이다.
List<Comment> findByTitleContains(String keyword);
title에 keyword를 포함하고 있는 Comment 목록 가져오기
@Query("SELECT c FROM Comment AS c")
위와 같은 경우 기본적으로 JPQL 로 인식한다.
native 쿼리(SQL)를 쓰고 싶으면 nativeQuery = true 옵션을 준다.
@Query(value = "SELECT * FROM Comment", nativeQuery = true)
이 전략이 기본전략이다.
위의 2개의 전략을 합쳐놓은 것이다.
리턴타입 접두어 {도입부} By 프로퍼티 조건식 (And, Or) 프로퍼티 조건식... 정렬조건 (매개변수)
리턴타입
: List<'엔티티이름'> / '엔티티이름' / Optional<'엔티티이름'> / Page<'엔티티이름'> / Slice<'엔티티이름'> 등
접두어
: find / get / count / delete 등
도입부
: Distinct / First / Top 등
프로퍼티
: Title / Name 등 엔티티 내부의 어트리뷰트
조건식
: IgnoreCase / Between / GreaterThan / LessThan / Like / Contains 등
정렬 조건
: OrderBy(프로퍼티) Asc / Desc
예시를 보자
Page<Comment> findByLikeCountGreaterThanAndPostOrderByIdAsc(int likeCount, Post post, Pageable pageable);
**Stream 타입일 경우 try-with-resource로 써줘야한다.
try(Stream<Comment> comments = commentRepository.findByCommentContains("spring")) { Comment firstComment = comments.findFirst().get(); assertThat(firstComment.getLikeCount()).isEqualTo(100); }