QueryDsl에서 서브쿼리는 쿼리 내부에 중첩되는 또 다른 쿼리를 의미합니다. 서브쿼리는 주로 복잡한 데이터 집합을 필터링하거나, 특정 조건에 해당하는 데이터를 검색할 때 사용됩니다. QueryDsl을 사용할 때, JPAExpressions 클래스를 활용하여 서브쿼리를 생성할 수 있으며, 이를 통해 select, where 등의 절 내에서 다양한 형태로 사용할 수 있습니다.
아래 쿼리는 회원을 조회하면서 조회 조건을 서브쿼리로 만든 예시입니다.
@Test
void 서브쿼리_테스트() {
List<Member> fetch = queryFactory
.select(member)
.from(member)
.join(member.team, team)
.where(member.team.name.eq(
JPAExpressions
.select(team.name)
.from(team)
.where(team.name.eq("teamA"))
))
.fetch();
System.out.println("fetch = " + fetch);
}
@Test
void 스칼라_서브쿼리_테스트() {
QMember subMember = new QMember("subMember");
List<Tuple> result = queryFactory
.select(member.username,
ExpressionUtils.as(
JPAExpressions
.select(subMember.age.avg())
.from(subMember), "col1")
)
.from(member)
.fetch();
System.out.println("result = " + result);
}
QueryDsl과 JPA를 사용할 때, from 절에서 직접적으로 서브쿼리를 사용하는 것은 허용하지 않습니다. JPA 스펙 자체의 제약사항으로 JPA 구현체(Hibernate) 에서는 from 절 내에서 서브쿼리를 허용하지 않습니다.
'QueryDSL' 카테고리의 다른 글
QueryDsl 동적쿼리 작성 방법 (1) | 2024.03.26 |
---|---|
QueryDsl 프로젝션 결과 반환 (0) | 2024.03.25 |
QueryDsl 조인 (0) | 2024.03.20 |
Querydsl 기본 문법 (0) | 2024.03.15 |
QueryDsl 소개 (0) | 2024.03.15 |