개요

서브 쿼리

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

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

    //then
    assertThat(result)
            .extracting("age")
            .containsExactly(40);
}

/**
 * 나이가 평균 이상인 회원
 */
@Test
void subQueryGoe() {
    //given
    QMember memberSub = new QMember("memberSub");

    //when
    List<Member> result = jpaQueryFactory
            .selectFrom(member)
            .where(member.age.goe(
                    JPAExpressions.select(memberSub.age.avg())
                            .from(memberSub)
            ))
            .fetch();

    //then
    assertThat(result)
            .extracting("age")
            .containsExactly(30, 40);
}

/**
 * 서브쿼리 여러 건 처리, in 사용
 */
@Test
void subQueryIn() {
    //given
    QMember memberSub = new QMember("memberSub");

    //when
    List<Member> result = jpaQueryFactory
            .selectFrom(member)
            .where(member.age.in(
                    JPAExpressions.select(memberSub.age)
                            .from(memberSub)
                            .where(memberSub.age.gt(10))
            ))
            .fetch();

    //then
    assertThat(result)
            .extracting("age")
            .containsExactly(20, 30, 40);
}

/**
 * select 절에 사용하는 서브쿼리 (스칼라 서브쿼리)
 * 하이버네이트 구현체를 사용하면 select 절의 서브쿼리는 지원
 */
@Test
void selectSubQuery() {
    //given
    QMember memberSub = new QMember("memberSub");

    //when
    List<Tuple> result = jpaQueryFactory
            .select(member.userName,
                    JPAExpressions
                            .select(memberSub.age.avg())
                            .from(memberSub))
            .from(member)
            .fetch();

    //then
    for (Tuple tuple : result) {
        System.out.println("tuple = " + tuple);
    }

    // Console Log
    // tuple = [member1, 25.0]
    // tuple = [member2, 25.0]
    // tuple = [member3, 25.0]
    // tuple = [member4, 25.0]
}