@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 되게 거슬림
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);
}
JPQL & QueryDSL은 FROM절에 SubQuery(=Inline View)를 지원하지 않는다.
↳ 🧐 Why? JPQL 문법 상 불가능
JPQL이 원하는 것 (SQL에서는 합법). 하지만 못하는 것
SELECT sub.slave_name
FROM (SELECT slave_name FROM slave WHERE age >= 20) sub