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

max9106·2020년 3월 25일
0

Query 만들기

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

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

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

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

List<Comment> findByTitleContains(String keyword);

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

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

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

위와 같은 경우 기본적으로 [JPQL] (https://velog.io/@max9106/JPA-%EC%BF%BC%EB%A6%ACQuery) 로 인식한다.

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);
    }
profile
이전 블로그: https://blog.naver.com/max9106

0개의 댓글