[JPA] Named 쿼리
2022. 8. 11. 13:04ㆍLanguage`/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"를 통해서 사용하면 된다