728x90
반응형
Named 쿼리는 정적 쿼리이다.
미리 정의해서 이름을 부여해두고 사용하는 JPQL이다.
주로 어노테이션이나 XML에 정의해두고
애플리케이션 로딩 시점에 초기화 후 재사용한다.
애플리케이션 로딩 시점에 쿼리를 검증한다.
(1) 어노테이션에서 사용하는 방법
Member.java
package jpql;
import javax.persistence.*;
@Entity
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username"
)
public class Member {
@Id @GeneratedValue
private Long id;
public MemberType getType() {
return type;
}
public void setType(MemberType type) {
this.type = type;
}
private String username;
private int age;
// 다대일은 항상 fetch를 LAZY 로 잡아줘야 한다.
// 그렇지 않으면 Team 을 조회하는 쿼리가 나온다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="TEAM_ID")
private Team team;
@Enumerated(EnumType.STRING)
private MemberType type;
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
@Override
public String toString() {
return "Member{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
", type=" + type +
'}';
}
}
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username"
)
@NamedQuery 추가
JpaMain.java
List<Member> members = em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
for (Member m : members) {
System.out.println("m = " + m);
}
(2) 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을 배포할 수 있다.
728x90
반응형
'자바 > JPA' 카테고리의 다른 글
[JPA/Java] JPQL 벌크 연산 (0) | 2023.05.11 |
---|---|
[JPA/Java] JPQL 엔티티 직접 사용 (0) | 2023.05.11 |
[JPA/Java] JPQL 다형성 쿼리 - TYPE, TREAT (0) | 2023.05.11 |
[JPA/Java] JPQL 패치 조인의 한계 - 글로벌 배치 패치 사이즈, @BatchSize (0) | 2023.05.11 |
[JPA/Java] JPQL fetch join (패치 조인) (2) | 2023.05.10 |
댓글