JPA/JPA 기본

51. Named 쿼리

sdafdq 2023. 11. 3. 09:30

네임드 쿼리.

미리 이름 정해놓고 쓰는 쿼리.

 

그러니까 미리 정의해 놓고 이름으로 호출해서 쓰는 함수 같은 거임

 

어디다 정의해 놓냐면,

 

@Entity
@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Member m where m.username = :username"
)
public class Member {
...

이렇게 엔티티 클래스에다가.

 

사용할 때는

List<Member> result1 = em.createNamedQuery("Member.findByUsername", Member.class)
        .setParameter("username", "회원1")
        .getResultList();

이렇게.

 

나가는 쿼리는 그냥 저 쿼리 나가는 거임.

Hibernate: 
    /* select
        m 
    from
        Member m 
    where
        m.username = :username */ select
            m1_0.id,
            m1_0.age,
            m1_0.team_id,
            m1_0.type,
            m1_0.username 
        from
            Member m1_0 
        where
            m1_0.username=?

 

이런 정적 쿼리인데,

 

 

이거는 따로 어노테이션이나 xml에 정의할 수 있고

 

 

이거의 진짜 장점은 2가지,

우선 하나는 애플리케이션 로딩 시점에 한번 캐싱 해놓고 계속 그거 재사용.

 

또 다른 장점 하나는

애플리케이션 로딩 시점에 쿼리를 검증한다.

그러니까, 애플리케이션을 실행해서 로딩하는 순간 저 쿼리에 이상이 있으면 컴파일 오류를 내보낸다.

 

이런 식으로 사용 하는 것 같다.

그런데 자주 사용하는 것은 아닌 것 같다. 

여튼 xml파일 만들어서 정의한 다음,

그걸 persistence.xml에 그 파일을 등록해 주면 되는 것 같다.

 

그리고 저렇게 클래스명에다가 한 것, 또 xml에다 한 것 이렇게 둘 다 같은 이름으로 있다면 xml이 우선권을 가진다.

 

그래서 뭐 운영환경마다 조금 씩 차이가 있을 수 있으니, xml만 따로 만들어 배포한다던지..

 

여튼 이정도로 하고 넘어가고,

 

 

나중에 SpringDataJPA를 배우게 될 텐데,

거기 중에 메소드에다가 직접

@Query("select u from User u where u.firstname like %?1")
List<User> findByFirstnameEndsWith(String firstname);

이런 식으로 정의할 수 있는데, 저게 NamedQuery 라고 한다. (이름없는 NamedQuery 라고 부른다.)

 

SpringDataJPA는 JPA의 껍데기역할을 한다고 보면 된다.

JPA를 편하게 사용하기 위한 추상화

 

그래서 보통 엔티티 위에다 저렇게 직접 지저분하게 쓰지는 않고,

SpringDataJPA로 저렇게 메소드에 직접 쓰는 경우는 있음.

 

 

 

'JPA > JPA 기본' 카테고리의 다른 글

52. JPQL 벌크연산  (0) 2023.11.03
50. 엔티티 직접 사용  (0) 2023.11.03
49. 다형성 쿼리  (0) 2023.11.03
48-2. 패치 조인의 한계  (0) 2023.11.02
48. 페치 조인 한계  (0) 2023.11.01