[JPA] 스프링 데이터 쿼리 만들기

Junseo Kim·2020년 3월 25일

Query 만들기

쿼리를 만드는 방법은 크게 3가지가 있다.

CREATE(메서드 이름을 분석해서 쿼리를 만드는 방법)

스프링 데이터 JPA가 메서드 이름을 분석해서 자동으로 쿼리를 만들어준다.

예를 들면 아래같은 경우이다.

List<Comment> findByTitleContains(String keyword);

title에 keyword를 포함하고 있는 Comment 목록 가져오기

USE_DECLARED_QUERY(메서드에 붙어있는 부가적인 정보를 사용해서 쿼리를 만드는 방법)

    @Query("SELECT c FROM Comment AS c")

위와 같은 경우 기본적으로 JPQL 로 인식한다.

native 쿼리(SQL)를 쓰고 싶으면 nativeQuery = true 옵션을 준다.

@Query(value = "SELECT * FROM Comment", nativeQuery = true)

CREATED_IF_NOT_FOUND(선언되어 있는 쿼리를 찾아보고, 없으면 메서드 이름을 분석하여 생성)

이 전략이 기본전략이다.

위의 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);
    }

0개의 댓글