H3-1. 최고령의 Slave

@Test // SubQuery
public void testSubQuery() throws Exception {
    QSlave subSlave = new QSlave("subSlave");
    List<Slave> slaves = queryFactory
            .selectFrom(slave)
            .where(slave.age.eq(
                    JPAExpressions
                            .select(subSlave.age.max())
                            .from(subSlave)
            )) // 서브쿼리로 Slave의 최대 나이와 같은 Slave를 조회
            .fetch();

    assertThat(slaves).extracting("age")
            .containsExactly(40);
}

↳ 저 JPAExpressions 되게 거슬림

H3-2. JPAExpressions를 static import로 따로 빼두기

import static com.querydsl.jpa.JPAExpressions.select;

@Test // Fucking JPAExpressions
public void testSubQueryWithoutJpaExpressions() throws Exception {
    // JPAExpressions 없이 서브쿼리 사용
    List<Slave> slaves = queryFactory
            .selectFrom(slave)
            .where(slave.age.eq(
                    select(slave.age.max())
                            .from(slave)
            )) // 서브쿼리로 Slave의 최대 나이와 같은 Slave를 조회
            .fetch();

    assertThat(slaves).extracting("age")
            .containsExactly(40);
}

H3-3. SubQuery의 한계

JPQL & QueryDSL은 FROM절에 SubQuery(=Inline View)를 지원하지 않는다.

↳ 🧐 Why? JPQL 문법 상 불가능

JPQL이 원하는 것 (SQL에서는 합법). 하지만 못하는 것


SELECT sub.slave_name
FROM (SELECT slave_name FROM slave WHERE age >= 20) sub