스프링데이터 + JPA/스프링 데이터 JPA

10. JPA 네임드 쿼리

sdafdq 2023. 11. 20. 11:27

얘는 실무에서 거의 쓸 일이 없음.

 

네임드 쿼리는 쿼리에 이름을 부여하고 호출하는 기능

 

이거보다 더 상위호환이 될 수 있는 좋은 기능이 있기에 이거는 잘 안씀.

 

그래도 소개를 해 보자면, 사용하려면

@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);
}

테스트 해 봐도 실행 잘 됨.

 

 

이것의 장점은 애플리케이션 로딩 시점에 쿼리를 검사한다.

그래서 로딩시점에 에러로 다 걸러낸다.