반응형
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
Named 쿼리
정적 쿼리
- 미리 정의해서 이름을 부여해두고 사용하는 JPQL
- 정적 쿼리만 가능함
- 애노테이션, XML에 정의
- 애플리케이션 로딩 시점에 초기화 후 재사용
- 애플리케이션 로딩 시점에 쿼리를 검증
애노테이션
Member 클래스에 @NamedQuery 애노테이션을 추가해준다. name의 경우 Member를 붙여도 되고 안 붙여도 되지만 관례는 붙이는 것이므로 큰 이유가 없는 이상 붙이는 게 좋다.
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username"
)
public class Member {
실행클래스에서 NamedQuery를 호출하고, 파라미터를 세팅하자.
List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "member1")
.getResultList();
for (Member member1 : resultList) {
System.out.println("member1 = " + member1);
}
Hibernate:
/* Member.findByUsername */ select
member0_.id as id1_0_,
member0_.age as age2_0_,
member0_.TEAM_ID as TEAM_ID5_0_,
member0_.type as type3_0_,
member0_.username as username4_0_
from
Member member0_
where
member0_.username=?
member1 = Member{id=3, username='회원1', age=0}
개발할 때 개발자에게 가장 도움?이 되는 오류는 컴파일 시 나는 오류이다. 왜냐면 거의 바로 잡을 수 있기 때문이다. Named 애노테이션은 애플리케이션 로딩 시점에서 쿼리를 SQL로 파싱하기 때문에 만약 쿼리문에 오타가 있고, SQL 문법과 맞지 않는다면 컴파일 오류가 발생한다.
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Membersd m where m.username = :username" // Membersd 오타
)
XML 정의
- persistence.xml
<persistence-unit name="jpabook" >
<mapping-file>META-INF/ormMember.xml</mapping-file>
- 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>
- XML이 항상 우선권을 가진다.
- 애플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다.
반응형