본문 바로가기

JPA/JPQL

서브쿼리

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 강의

'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