11. 객체지향 쿼리 언어 - 중급 문법 (Named 쿼리)

HotFried·2023년 10월 5일
0
  • 미리 정의해서 이름을 부여해두고 사용하는 JPQL

  • 정적쿼리

  • 어노테이션 or XML에 정의

  • 애플리케이션 로딩 시점에 초기화 후 재사용
    - 정적 쿼리이기 때문에 변하지 않으니 JPA나 하이버네이트가 파싱할 때 캐싱해서 사용한다.
    -> 즉, 로딩 시점에 한 번 캐싱을 해두므로 코스트가 줄어든다.

  • 애플리케이션 로딩 시점에 쿼리를 검증
    -> 실행 시점에 문법이 안 맞으면 예외를 발생시킨다.


어노테이션

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

public class JpaMain {
    public static void main(String[] args) {
        List<Member> resultList =
                // 어노테이션에 정의한 이름 사용
                em.createNamedQuery("Member.findByUsername", Member.class)
                        .setParameter("username", "회원1")
                        .getResultList();
    }
}

XML

META-INF/PERSISTENCE.XML

<persistence-unit name="jpabook">
    <mapping-file>META-INF/ormMember.xml</mapping-file>

META-INF/ormMember.xml

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" version="2.1">

    <named-query name="Member.findByUsername">
        <query><![CDATA[
			select m
			from Member m
			where m.username = :username
		]]></query>
    </named-query>
    
    <named-query name="Member.count">
        <query>select count(m) from Member m</query>
    </named-query>
    
</entity-mappings>

Named 쿼리 환경에 따른 설정

  • XML이 항상 우선권을 가진다.
  • 애플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다.

참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글