-> 블로그 이전

[JPA] Named 쿼리

2022. 8. 11. 13:04Language`/JPA

1. 동적 쿼리 (em.createQuery)

동적 쿼리는 말 그대로 createQuery 메소드를 활용해서 직접 JPQL을 만들어서 넘겨주는 쿼리이다

em.createQuery(
        "SELECT m" +
                " FROM Member m",
        Member.class
).getResultList();

em.createQuery(
        "SELECT m" +
                " FROM Member m" +
                " WHERE m.team.id = :teamId",
        Member.class
).setParameter("teamId", 1L)
        .getResultList();

em.createQuery(
        "SELECT t" +
                " FROM Team t" +
                " WHERE t.name LIKE '%A%'" +
                " ORDER BY t.name",
        Team.class
).getResultList();

 

2. 정적 쿼리 (@NamedQuery)

정적 쿼리는 "애플리케이션 로딩 시점"JPQL 문법을 미리 체크하고 파싱해서 애플리케이션 자체에 생성해놓는 것이다.

따라서 오류를 빨리 확인할 수 있고, 파싱된 결과를 재사용하기 때문에 성능상 이점도 존재한다

  • 정적 쿼리는 한번 만들면 변경이 불가능하다

▶ name

Named 쿼리의 이름을 설정해주는 속성이다

 

▶ query

Named 쿼리에서 사용할 쿼리를 명시해주는 속성이다

 

▶ lockMode

쿼리 실행시 Lock을 어떤 모드로 걸지 설정하는 속성이다

 

▶ hints

hints란 SQL 힌트가 아니라 "JPA 구현체에게 제공해주는 힌트"를 의미한다

hints는 영속성 컨텍스트의 "2차 캐시"를 다룰때 사용한다

 

 

※ Example

@NamedQueries({
        @NamedQuery(
                name = "Member.basicSearch",
                query = "SELECT m FROM Member m"
        ),
        @NamedQuery(
                name = "Member.searchByTeam",
                query = "SELECT m FROM Member m WHERE m.team.id = 1"
        )
})
public class Member {
    ...
    ...
}
@NamedQuery(
        name = "Team.searchByName",
        query = "SELECT t FROM Team t WHERE t.name LIKE '%A%' ORDER BY t.name"
)
public class Team {
    ...
    ...
}
em.createNamedQuery(
        "Member.basicSearch",
        Member.class
).getResultList();

em.createNamedQuery(
        "Member.searchByTeam",
        Member.class
).getResultList();

em.createNamedQuery(
        "Team.searchByName",
        Member.class
).getResultList();

엔티티 레벨에 @NamedQueries/@NamedQuery를 통해서 정적 쿼리를 생성하고, 이를 사용할 때는 "em.createNamedQuery"를 통해서 사용하면 된다