1 분 소요

  • 메서드 이름으로 쿼리 생성
  • NamedQuery
  • @Query - 리파지토리 메서드에 쿼리 정의
  • 파라미터 바인딩
  • 반환타입
  • 페이징과 정렬
  • 벌크성 수정 쿼리
  • @EntityGraph

스프링 데이터 JPA가 제공하는 마법같은 기능

쿼리 메서드 기능 3가지

  • 메서드 이름으로 쿼리 생성
  • 메서드 이름으로 JPA NamedQuery 호출
  • @Query어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의

메서드 이름으로 쿼리 생성

메서드 이름을 분석해서 JPQL 쿼리 실행 ??!

이름과 나이가 같은 회원을 조회 하려면?

순수 JPA 리포지토리 에선..

1
2
3
4
5
6
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {  
    return em.createQuery("select m from Member m where m.username = :username and m.age > :age", Member.class)  
            .setParameter("username", username)  
            .setParameter("age", age)  
            .getResultList();  
}

스프링 데이터 JPA

1
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

… 이거 한줄이면 된다.. 심지어 인텔리제이에서 자동완성도 해준다..

테스트 코드도 다음과 같이 잘 통과 한다. 내가 원하는 where문이 잘 나간다. 네이밍 관례로 메서드를 만든다는 점이 신기 하면서 재밌는 거 같다. ㅎㅎ; 메서드 네이밍을 잘못하면 오류가 난다. 다음과 같이 이름을 틀리면 오류가 저렇게 나온다.

  • 스프링 데이터 JPA는 메서드 이름을 분석해서 JPQL을 생성하고 실행

쿼리 메서드 필터 조건 스프링 데이터 JPA 공식 문서 참고 : (스프링 데이터 JPA 공식문서)

스프링 데이터 JPA가 제공하는 쿼리 메서드 기능

  • 조회 : find..By, read…By, query…By, get…By
    • ex) findHelloBy처럼 …에 식별하기 위한 내용이 들어가기도 한다. 없으면 전체 조회
  • COUNT : count..By 반환타입 long
  • EXISTE: exists..By 반환타입 boolean
  • 삭제 : delete … By, remove … By 반환타입 long
  • DISTINCT : findDistinct, findMemberDistinctBy
  • LIMIT : findFirst3, findFirst, findTop, findTop3

참고 : 이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다. 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.

태그: ,

카테고리:

업데이트:

댓글남기기