본문 바로가기
JPA/JPA

[JPA] JPQL - Named 쿼리 (정적 쿼리)

by 걸어가는 신사 2022. 1. 8.

1. 동적 쿼리 vs 정적 쿼리

(1) 동적 쿼리

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

(2) 정적 쿼리

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

 

2. 정적 쿼리 특징

  • 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱한다.
    • 로딩 시점에 쿼리를 검증하므로 오류를 빠르게 확인할 수 있다.
    • 사용하는 시점에는 파싱 된 결과를 재사용하므로 성능상 이점이 있다.
  • 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능 최적화에 도움이 된다.
  • @NamedQuery 어노테이션 or XML에 정의할 수 있다.

 

3. @NamedQuery 어노테이션 

@Repeatable(NamedQueries.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface NamedQuery {
    String name(); //Named 쿼리 이름 (필수)

    String query(); //JPQL 정의 (필수)

    LockModeType lockMode() default LockModeType.NONE; //쿼리 실행 시 락모드를 설정할 수 있다.

    QueryHint[] hints() default {}; //JPQ 구현체에 쿼리 힌트를 줄 수 있다.
}
  • lockMode : 쿼리 실행 시 락을 건다.
  • hints : 여기서 힌트는 SQL 힌트가 아니라 JPA 구현체에게 제고하는 힌트이다.

 

4. Named 쿼리 사용법

@Entity
@Getter @Setter
@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Member m where m.username = :username")
public class Member {
	...
}
  • @NamedQuery.name에 쿼리 이름을 부여한다.
  • @NamedQuery.query에 사용할 쿼리를 입력한다.
List<Member> result = em.createNamedQuery("Member.findByUsername", Member.class)
	.setParameter("username", "member1")
	.getResultList();
  • Named 쿼리를 사용할 때는 em.createNamedQuery() 메소드에 Named 쿼리 이름을 입력한다.
Named 쿼리 이름을 간단히 findByUsername이라 하지 않고 Member.findByUsername 처럼 앞에 엔티티 이름을 주었는데 이것이 기능적으로 특별한 의미가 있는 것은 아니다.
하지만 Named 쿼리는 영속성 유닛 단위로 관리되므로 충돌을 방지하기 위해 엔티티 이름을 앞에 주었다.
그리고 엔티티 이름이 앞에 있으면 관리하기 쉽다.
  • 하나의 엔티티에 2개 이상의 Named 쿼리를 정의하기 위해 @NamedQueries 어노테이션을 사용한다.
@Entity
@Getter @Setter
@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 {
	...
}

 

반응형

'JPA > JPA' 카테고리의 다른 글

[JPA] JPQL - 벌크 연산  (0) 2022.01.08
[JPA] JPQL - 조건식  (0) 2022.01.08
[JPA] JPQL - 경로 표현식(Path Expression)과 묵시적 조인  (0) 2022.01.07
[JPA] JPQL - 페치 조인(Fetch Join)  (0) 2022.01.07
[JPA] JPQL - 조인(Join)  (0) 2022.01.07

댓글