본문 바로가기
자바/JPA

[JPA/Java] JPQL Named 쿼리 - 어노테이션, XML

by drCode 2023. 5. 11.
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);
}

JPQL  쿼리 결과

 

(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
반응형

댓글