서브 쿼리는 SQL 에서 정말 많이 사용합니다.

그런데 QueryDsl에서는 java 코드다보니 사용하기가 좀 쉽지는 않은데요, 기본적인 사용법들과 한계점, 주의할 것들을 알아보겠습니다.

서브 쿼리

QueryDsl 에서 서브 쿼리는 com.querydsl.jpa.JPAExpressions 을 사용해서 작성하면 됩니다.

JPQL 서브 쿼리 참고

서브 쿼리 eq 사용

나이가 가장 많은 회원 조회 테스트 코드를 작성해보겠습니다.

@BeforeEach
void setUp() {
    queryFactory = new JPAQueryFactory(em);

    Team teamA = new Team("teamA");
    Team teamB = new Team("teamB");
    em.persist(teamA);
    em.persist(teamB);

    Member member1 = new Member("member1", 10, teamA);
    Member member2 = new Member("member2", 20, teamA);
    Member member3 = new Member("member3", 30, teamB);
    Member member4 = new Member("member4", 40, teamB);
    em.persist(member1);
    em.persist(member2);
    em.persist(member3);
    em.persist(member4);
}

@DisplayName("나이가 가장 많은 회원 조회")
@Test
void subQuery() {
    QMember memberSub = new QMember("memberSub");

    List<Member> result = queryFactory
            .selectFrom(member)
            .where(member.age.eq(
                    JPAExpressions
                            .select(memberSub.age.max())
                            .from(memberSub)
            ))
            .fetch();

    assertThat(result)
            .extracting("age")
            .containsExactly(40);
}
  1. 서브 쿼리에서 member 를 또 사용하기 때문에 별칭이 겹칩니다. 그래서 추가적으로 QMember를 생성해야 합니다.

    참고

  2. JPAExpressions

실행해서 쿼리를 확인해봅시다.

Untitled

서브 쿼리 goe 사용