얘는 실무에서 거의 쓸 일이 없음.
네임드 쿼리는 쿼리에 이름을 부여하고 호출하는 기능
이거보다 더 상위호환이 될 수 있는 좋은 기능이 있기에 이거는 잘 안씀.
그래도 소개를 해 보자면, 사용하려면
@NamedQuery(
name = "Member.findByUsername",
query="select m from Member m where m.username=:username"
)
public class Member {
...
이렇게 엔티티에 적어놓음( 따로 xml파일에 정의해 놓을 수도 있음. )
public List<Member> findByUsernameNameQuery(String username){
return em.createNamedQuery("Member.findByUsername",Member.class)
.setParameter("username", username)
.getResultList();
}
엔티티매니저, 그러니까 그냥 Jpa에서는 이렇게 쓰면 되고.
@Query(name = "Member.findByUsername")
List<Member> findByNamedQuery(@Param("username") String username);
SpringDataJpa(JpaRepository 상속받은거)는 이렇게 쓰면 됨.
참고로, 지금 네임드 쿼리 이름을 findByUsername 이렇게 해놨는데,
메소드 명을 그냥 findByUsername이라고 하면 저렇게 name해서 명시안해줘도 알아서 잘 찾아줌.
@Query 붙이면 엔티티명.메소드명 해서 알아서 찾아봄.
그 후 없으면 그냥 메소드명으로 자동으로 쿼리 생성.
우선순위가 위임.
@Test
public void testNamedQuery(){
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberRepository.save(m1);
memberRepository.save(m2);
List<Member> result = memberRepository.findByNamedQuery("AAA");
Member findMember = result.get(0);
assertThat(findMember).isEqualTo(m1);
}
테스트 해 봐도 실행 잘 됨.
이것의 장점은 애플리케이션 로딩 시점에 쿼리를 검사한다.
그래서 로딩시점에 에러로 다 걸러낸다.
'스프링데이터 + JPA > 스프링 데이터 JPA' 카테고리의 다른 글
12. Dto나 테이블 중 특정 값만 조회해 오기 (0) | 2023.11.20 |
---|---|
11. @Query, 메소드에 쿼리 정의 (0) | 2023.11.20 |
9. 메소드 이름으로 쿼리 생성 (0) | 2023.11.20 |
8. 공통 인터페이스 분석 (0) | 2023.11.19 |
7. 공통 인터페이스 적용 (0) | 2023.11.19 |