만약, JpaRepository 공통의 기능이 아닌 도메인에 특화된 기능을 만드려면 어떻게 해야할까?
이건 우리가 구현해야할까? 아니다! 구현하지 않아도 동작한다. => 쿼리메소드 이용하면 가능
- 쿼리메소드 기능 3가지
- 메소드 이름으로 쿼리를 생성한다.
- 메소드 이름으로 JPA NamedQuery를 호출한다.
- @Query 어노테이션을 사용해서 레포지토리 인터페이스에 쿼리를 직접 정의할 수 있다.
1. 메소드 이름으로 쿼리를 생성한다.
<<순수JPA>>
원래는 이렇게 쿼리를 짜야한다.
//회원명과 나이 비교 후 조회
public List<Member> findByUsernameAndAgeGreaterThen(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
<<스프링 데이터 JPA>>
정해진 메소드명을 따르면 JPA가 알아서 구현체를 만들어준다!!!!!!!!
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThen(String username, int age);
}
정해진 메소드명 문법에 대해 알고 싶다면?
docs.spring.io/spring-data/jpa/docs/2.4.7/reference/html/#reference
위 주소에서 Query Creation 부분에서 확인할 수 있다.
- 조회 : find...By, read...By, query...By, get...By
- findHellodBy(); // By뒤에 아무것도 안붙이면 전체 조회가 된다.
- COUNT : count...By [long]
- EXISTS : exists...By [boolean]
- 삭제 : delete...By, remove...By [long]
- DISTINCT : findDistinct, findMemberDistinctBy : 쿼리에 distinct 넣어짐. 중복제거
- LIMIT : findFirst3, findFirst, findTop, findTop3, findTop3HelloBy : 개수 지정, limit
- 필드명을 따르므로, 엔티티의 필드명이 변경되면 메소드명도 수정해야한다.
한가지 문제는 여러 테이블을 조인하려면 메소드명이 너무 길어질 수 있다는 점이다.
그래서 보통 2개정도는 메소드방식을 이용하지만 더 많으면 커스텀 등 다른 방법을 사용할 수 있다.
ex ) JPA NamedQuery, 어노테이션 등
'Spring > Data JPA' 카테고리의 다른 글
[Data JPA] 순수 JPA 페이징과 정렬 (0) | 2021.04.23 |
---|---|
[DataJPA] @Query, 레포지토리에 쿼리를 정의 (0) | 2021.04.14 |
[DataJPA] 스프링 데이터 JPA 인터페이스 (0) | 2021.04.14 |
댓글