JPQL - Named 쿼리 - 정적 쿼리

2024. 5. 14. 16:01JPA

반응형

JPQL 쿼리는 크게 정적 쿼리와 동적 쿼리로 나눌 수 있다.

- 동적 쿼리: em.createQuery(“select…”) 처럼 jpql을 문자로 완성해서 직접 넘기는 것. 런타임에 특정 조건에 따라 jpql을 동적으로 구성할 수 있다.

- 정적 쿼리: 미리 정의한 쿼리에 이름을 부여해서 필요할 때 사용할 수 있는데 이것을 Named 쿼리라 한다. Named 쿼리는 한 번 정의하면 변경할 수 없는 정적인 쿼리다.

Named 쿼리는 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱해둔다. 따라서 오류를 빨리 확인할 수 있고, 사용하는 시점에는 파싱된 결과를 재사용하므로 성능상 이점도 있다. 그리고 Named 쿼리는 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능 최적화에도 도움이 된다. Named 쿼리는 @NamedQuery 어노테이션을 사용해서 자바 코드에 작성하거나 XML 문서에 작성할 수 있다.

 

@NamedQuery 어노테이션으로 Named Query 정의

@Entity
@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”, “회원1”)
    	.getResultList();

 

하나의 엔티티에 2개 이상의 Named 쿼리를 정의하려면 @NamedQueries 어노테이션을 사용하면 된다.

@Entity
@NamedQueries({
	@NamedQuery(
		name = “Member.findByUsername”,
		query = “select m from Member m where m.username = :username”),
	@NamedQuery(
		name = “Member.count”,
		query=“select count(m) from Member m”)
})
public class Member { … }

 

Named 쿼리를 XML에 정의할 수도 있다.

자바 언어로 멀티라인 문자를 다루는 것은 굉장히 귀찮은 일이기 때문에 이런 불현함을 해결하려면 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 파일을 인식하도록 META-INF/persistence.xml에 다음 코드를 추가해야한다.

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

 

환경에 따른 설정

만약 XML과 어노테이션에 같은 설정이 있으면 XML이 우선권을 가진다. 예를 들어 같은 이름의 Named 쿼리가 있으면 XML에 정의한 것이 사용된다. 따라서 애플리케이션이 운영 환경에 따라 다른 쿼리를 실행해야 한다면 각 환경에 맞춘 XML을 준비해 두고 XML만 변경해서 배포하면 된다.

반응형

'JPA' 카테고리의 다른 글

JPQL - Criteria 기초 (조회, 집합, 정렬)  (0) 2024.05.28
JPQL - CASE 식  (0) 2024.03.25
JPQL - 서브 쿼리  (2) 2023.10.23
JPQL - 경로 표현식  (4) 2023.10.23
JPQL - 페치 조인(Fetch Join)  (0) 2023.10.12