Querydsl - 서브 쿼리

HotFried·2024년 2월 25일
0

Querydsl

목록 보기
5/9

서브 쿼리는
com.querydsl.jpa.JPAExpressions 클래스를 이용해 구성한다.


eq, goe, In 예제

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절

select절도 마찬가지로 JPAExpressions를 이용해 간단하게 구성 가능하다.

List<Tuple> fetch = queryFactory
                .select(member.username,
                        JPAExpressions
                                .select(memberSub.age.avg())
                                .from(memberSub)
                ).from(member)
                .fetch();

from절

JPA JPQL 서브쿼리의 한계점으로 from 절의 서브쿼리(인라인 뷰)는 지원하지 않는다. (당연히 Querydsl도 지원하지 않는다).

하이버네이트 구현체를 사용하면 select 절의 서브쿼리는 지원한다.
Querydsl도 하이버네이트 구현체를 사용하면 select 절의 서브쿼리를 지원한다

from절 서브쿼리 해결 방안

  1. 서브쿼리를 join으로 변경한다. (안될수도 있음)
  2. 애플리케이션에서 쿼리를 2번 분리해서 실행한다.
  3. nativeSQL을 사용

참고 :

실전! Querydsl

profile
꾸준하게

0개의 댓글