JPA NamedQuery
NamedQuery를 사용하면 엔티티에 쿼리를 정의해두고, 리퍼지토리에서 해당 쿼리를 호출하도록 할 수 있다.
username으로 Member를 조회하는 예시를 보자. (NamedQuery에 주목되도록 다른 코드들은 대부분 제거하였다.)
@NamedQuery(name="Member.findByUsername", query="select m from Member m where m.username= :username")
@Entity
public class Member {
...
@Id @GeneratedValue
private Long id;
private String username;
private int age;
private Team team;
...
}
@NamedQuery(name="Member.findByUsername",
query="select m from Member m where m.username= :username")
@NamedQuery를 보면 name에는 해당 쿼리의 이름(리퍼지토리에서 호출시 필요. 본인이 원하는대로 지정 가능하지만 형식상 '엔티티이름.메서드이름'을 한다.)
query에는 원하는 쿼리를 넣으면 된다.
Member 엔티티에서 정의한 NamedQuery를 순수 jpa에서 사용하기 위해서는 아래와 같다.
import org.springframework.stereotype.Repository;
import study.datajpa.entity.Member;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
import java.util.Optional;
@Repository
public class MemberJPArepository {
@PersistenceContext
private EntityManager em;
//Member엔티티의 NamedQuery 호출
public List<Member> findByUsername(String username){
return em.createNamedQuery("Member.findByUsername", Member.class)//createNamedQuery
.setParameter("username", username)
.getResultList();
}
....
}
em.createNamedQuery 메서드의 인자에 Member엔티티에서 지정한 쿼리 이름을 넣고, 두번째 인자에는 해당 엔티티 타입을 넣어주면 된다.
data jpa 리퍼지토리에서 사용하기 위해서는 아래와 같이 해준다.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import study.datajpa.entity.Member;
import java.util.List;
public interface MemberRepository extends JpaRepository<Member, Long> {
...
@Query(name="Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
...
}
@Query의 name에는 Member 엔티티에 지정한 쿼리 이름을 넣어준다.
findByUsername이라는 메서드 이름은 필수로 맞춰주어야 하는 것은 아니지만 맞춰주는것이 좋다. 이유는 아래의 2번 때문이다.
1. 스프링 데이터 JPA는 선언한 "도메인 클래스 + .(점) + 메서드 이름"으로 Named 쿼리를 찾아서 실행.
2. 만약 실행할 Named 쿼리가 없으면 메서드 이름으로 쿼리 생성 전략을 사용한다.
하지만 딱 봐도 NamedQuery는 많이 사용할 것 같은 방법은 아니다. 일단 엔티티에 쿼리가 있는 것부터가... 영 아니다 싶다. 실제로 실무에서도 사용하는 방법은 아니라고 한다.
더 강력하고 실무에서 사용되는 '리포지토리 메서드에 쿼리 정의하기'를 다음 포스트에서 배워보자.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
'JPA > 스프링 DATA JPA' 카테고리의 다른 글
Data JPA 06 쿼리 메서드 - 반환타입, 페이징 (0) | 2022.01.06 |
---|---|
Data JPA 05 쿼리 메서드 - Query, 리포지토리 메서드에 쿼리 정의하기 (0) | 2022.01.05 |
Data JPA 03 쿼리 메소드 - 메서드 이름으로 쿼리 생성 (0) | 2022.01.05 |
Data JPA 02 - 예제 도메인 확인하기, 공통 인터페이스 (0) | 2022.01.04 |
Data JPA 01 - 스프링 데이터 jpa 맛보기 (0) | 2022.01.02 |