본문 바로가기
QueryDSL

QueryDsl 서브쿼리

by 이상한나라의개발자 2024. 3. 20.

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