JPQL에서 서브쿼리도 사용가능하다.
이 글에서는 서브쿼리가 무엇인지보다는 JPQL에서 서브쿼리를
어떻게 사용하는지에 대해 탐구해볼 것이다.
JPQL 서브쿼리
// progammin부원들의 나이와 일치하는 학생 조회
String query = "select s from Student s where s.age in (select s.age from Student s join s.club c on s.club.name = 'programming')";
List<Object[]> students = em.createQuery(query).getResultList();
실질적인 SQL
select s from Student s where s.age in
( select s1.age from Student s1 inner join Club c
on s1.CLUB_ID=c.id and ( c.name='programming' ) )
log를 확인해보면 Hibernate에서 subquery를 잘 만들어준 것을 알 수 있다.
또한 subquery에서는 all, any, in, exists 등의 다중행비교 연산자도 사용가능하다.
JPA 서브쿼리 한계
- 표준스펙 상 서브쿼리는 Where 및 Having절에서만 사용가능(JPA버전 2.1 기준)
- JPA 구현체 중 하이버네이트는 select절에서의 서브쿼리도 지원
(JPA 2.1 기준으로 표준스펙에는 Where 및 Having절만 표시되어있음)
서브 쿼리를 사용할 수 있는 위치가 한정되어있다.
때문에 허용된 위치 외에 다른 곳에서 반드시 서브쿼리를 사용해야하는 경우에는
native SQL을 사용하거나 쿼리 2번을 날려서 해결해주자!
참고문서: openjpa
'JPA > JPQL' 카테고리의 다른 글
N+1과 fetch join (0) | 2021.10.02 |
---|---|
경로표현식 (0) | 2021.10.02 |
JPQL 함수 (0) | 2021.09.25 |
JPQL에서의 Enum과 조건식 (0) | 2021.09.17 |
조인 (0) | 2021.09.15 |