오봉이와 함께하는 개발 블로그
스프링 데이터 JPA - 메소드 이름으로 쿼리 생성 본문
728x90
메소드 이름으로 쿼리 생성
메소드 이름을 분석해서 JPQL 쿼리 실행해준다.
이름과 나이를 기준으로 회원을 조회하려면 어떻게 해야 할까?
순수 JPA 리포지토리
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 테스트 코드
@Test
void findByUsernameAndAgeGreaterThan() {
Member memA1 = new Member("memA", 10);
Member memA2 = new Member("memA", 20);
memberJpaRepository.save(memA1);
memberJpaRepository.save(memA2)
List<Member> result = memberJpaRepository.findByUsernameAndAgeGreaterThan("memA", 15)
assertThat(result.get(0).getUsername()).isEqualTo("memA");
assertThat(result.get(0).getAge()).isEqualTo(20);
assertThat(result.size()).isEqualTo(1);
}
스프링 데이터 JPA
public interface MemberRepository extends JpaRepository<Member, Long> {
// <T(Object Type), ID(T의 PK가 어떤 타입인가?)>
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
스프링 데이터 JPA 테스트 코드
@Test
void findByUsernameAndAgeGreaterThan() {
Member memA1 = new Member("memA", 10);
Member memA2 = new Member("memA", 20);
memberRepository.save(memA1);
memberRepository.save(memA2)
List<Member> result = memberRepository.findByUsernameAndAgeGreaterThan("memA", 15)
assertThat(result.get(0).getUsername()).isEqualTo("memA");
assertThat(result.get(0).getAge()).isEqualTo(20);
assertThat(result.size()).isEqualTo(1);
}
스프링 데이터 JPA는 메소드 이름을 분석해서 JPQL을 생성하고 실행한다!
쿼리 메소드 필터 조건
findByUsernameAndAgeGreaterThan
은 findBy
뒤에 필드명을 입력하는 관례로 작동한다.findByXXX
로 입력하면 자동으로 where절에 XXX를 입력하고 =
에 대한 결과를 찾는다.And
는 쿼리문에서 where절 조건에 and
로 들어가고 다음 필드명 Age
의 뒤에 GreaterThan
이 있어 Age
< parameter
가 된다.
스프링 데이터 JPA 공식 문서 참고 : (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)
스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
- 조회 : find...By ,read...By ,query...By get...By
- https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation
- 예 : findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.
- COUNT : count...By 반환타입 long
- EXISTS : exists...By 반환타입 boolean
- 삭제 : delete...By, remove...By 반환타입 long
- DISTINCT : findDistinct, findMemberDistinctBy
- LIMIT : findFirst3, findFirst, findTop, findTop3
- findFirst3(findTop3)는 첫번째 ~ 세번째, findFirst(findTop)는 첫번째만
- https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result
이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다. 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.
인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
'BE > JPA' 카테고리의 다른 글
스프링 데이터 JPA - @Query(리포지토리 메소드에 쿼리 정의하기, 값, DTO 조회하기) (0) | 2022.09.08 |
---|---|
스프링 데이터 JPA - JPA NamedQuery (0) | 2022.09.08 |
스프링 데이터 JPA - 공통 인터페이스 설정, 적용, 분석 (0) | 2022.09.07 |
스프링 데이터 JPA - 예제 도메인 모델과 동작확인 (0) | 2022.09.07 |
스프링 데이터 JPA - 동작 확인 (0) | 2022.09.07 |
Comments