미리 정의해서 이름을 부여해두고 사용하는 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();
}
}
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>
참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.