서브 쿼리는
com.querydsl.jpa.JPAExpressions
클래스를 이용해 구성한다.
JpaExpressions
클래스를 통해 구성하고, 조건만 변경해주면 간단하게 이용 가능
1. equal
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(
JPAExpressions
.select(memberSub.age.max())
.from(memberSub)))
.fetch();
2. greaterthan or equal
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.goe(
JPAExpressions
.select(memberSub.age.avg())
.from(memberSub)))
.fetch();
3. In
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.in(
JPAExpressions
.select(memberSub.age)
.from(memberSub)
.where(memberSub.age.gt(10))))
.fetch();
select
절도 마찬가지로 JPAExpressions
를 이용해 간단하게 구성 가능하다.
List<Tuple> fetch = queryFactory
.select(member.username,
JPAExpressions
.select(memberSub.age.avg())
.from(memberSub)
).from(member)
.fetch();
JPA JPQL 서브쿼리의 한계점으로 from 절의 서브쿼리(인라인 뷰)는 지원하지 않는다. (당연히 Querydsl도 지원하지 않는다).
하이버네이트 구현체를 사용하면 select 절의 서브쿼리는 지원한다.
Querydsl도 하이버네이트 구현체를 사용하면 select 절의 서브쿼리를 지원한다
from절 서브쿼리 해결 방안
참고 :