메소드 이름으로 쿼리 생성
Spring Data JPA는 메서드 이름을 통해 쿼리를 작성해주는 쿼리 기능을 제공한다.
(공식 문서 : Spring Data JPA - Reference Documentation)
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
위 메서드 이름을 통해 실행도니느 쿼리는 다음과 같다.
select m from Member m where m.username = :username and m.age > :age"
이 기능은 보통 파라미터 개수가 적을 때 사용한다.
( 파라미터 수가 많아지면 메서드 이름이 너무 길어져 가독성이 떨어짐 )
그리고 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다.
그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다.
사용 방법
findHelloBy, countNumberNy 처럼 ...에 식별하기 위한 설명이 들어가도 되고 생략해도 된다.
- 조회: find…By ,read…By ,query…By get…By (공식 문서 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation)
- COUNT : count…By (반환타입 long)
- EXISTS: exists…By (반환타입 boolean)
- DELETE : delete…By, remove…By (반환타입 long)
- DISTINCT : find...Distinct, findMemberDistinctBy
- LIMIT : find...First3, find...First, find...Top, find...Top3 (공식 문서 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result)
@Query - 쿼리 직접 정의
@Query를 사용해서 직접 쿼리를 정의하는 방법으로 아래 포스팅 내용으로 대체한다.
반환 타입
스프링 데이터 JPA는 유연한 반환 타입 지원한다.
(공식 문서 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types)
List<Member> findByUsername(String name); //컬렉션
Member findByUsername(String name); //단건
Optional<Member> findByUsername(String name); //단건 Optional
null
컬렉션의 경우 반환 결과가 없다면 null이 아닌 빈 컬렉션을 반환한다.
하지만, 단건 조회의 경우 결과가 없으면 null, 중복된 결과가 있으면 javax.persistence.NonUniqueResultException 예외가 발생한다.
이를 예방하기 위해 단건 조회시 다음과 같이 결과가 없을 때 따로 처리하는 방법을 사용하도록 하자.
Member member = memberRepository.findById(10L).orElseThrow(() -> new CustomException("찾고자 하는 멤버가 없습니다."));
'◼ JPA' 카테고리의 다른 글
[Spring Data JPA] @EntityGraph 엔티티 그래프란? (0) | 2023.06.20 |
---|---|
[JPA] 페이징과 정렬에 대해 알아보자. (0) | 2023.06.20 |
[JPA] 컬렉션 조회 시 주의할 점 (hibernate.default_batch_fetch_size) (0) | 2023.06.20 |
JpaRepository를 상속한 인터페이스가 구현체가 없이 동작하는 이유 (0) | 2023.06.19 |
[JPA] @Modifying이란? 그리고 주의할점 (벌크 연산) (0) | 2023.06.12 |