쿼리 메소드 기능
메소드 이름으로 쿼리 생성
: 메소드 이름을 분석해서 JPQL 쿼리 실행을 시켜줘!!
스프링 데이터 jpa가 제공하는 쿼리 메소드 기능
(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference)
- 조회 : find…By, read…By, query…By, get…By (…에는 어떠한 것도 들어갈 수 있다 ex) findHelloBy)
- COUNT: count…By (반환타입 : long)
- EXISTS : exists…By (반환타입 : boolean)
- 삭제 : delete…By, remove…By (반환타입 : long)
- DISTINCT : findDistinct, findMemberDistinctBy
- LIMIT : findFirst3, findFrist, findTop, findTop3 이런식으로
JPA NamedQuery
: JPA의 NamedQuery를 호출할 수 있어.
1 |
|
- Spring Data Jpa는 선언한 “도메인 클래스 + . + 메서드 이름”으로 Named 쿼리를 찾아서 수행해줘
- 없으면 메서드 이름으로 쿼리 생성 전략을 사용해.
@Query, 레파지토리 메소드에 쿼리 정의
1 | public interface MemberRepository extends JpaRepository<Member, Long> { |
- @org.springframework.data.jpa.repository.Query 어노테이션을 사용해
- 실행할 메서드에 정적 쿼리를 직접 작성하기에 이름없는 Named 쿼리라고 할 수 있지
- JPA Named 쿼리가 주는 가장 큰 이점인 어플리케이션 실행 시점에 문법 오류를 발견할 수 있어!! goood!
@Query, 값, DTO 조회하기
- 단순히 값 하나 조회
1 |
|
이런식으로 사용할 수 있어.
JPA 값 타입(Embedded)도 이렇게 조회 가능해
- DTO로 직접 조회
1 |
|
이렇게 DTO로 직접 조회하기 위해서는 JPA의 new 명령어를 쓰면 돼. 이때 패키지 위치를 기재하여야하며 해당 생성자를 가진 DTO가 필요해!!
파라미터 바인딩
두가지 방법이 있어
- 위치 기반
- 이름 기반
1 | select m from Member m where m.username = ?0 //위치 기반 |
가독성과 유지보스를 위해 이름기반 파라미터 바인딩을 쓰자!!
참고로 Collection 타입을 파라미터로 넘겨서 in 절을 이용할 수 있어!!
1 |
|
반환 타입
유연한 반환타입을 지원해!!
컬랙션, 단건, Optional 원하는 대로 사용 가능해
(단건일 때 만약 조회 결과가 없으면 null을 반환하게 끔 spring data jpa 에서 처리를 해줬어. 원래는 javax.persistence.NoResultException 예외 발생해)