서브 쿼리는 SQL 에서 정말 많이 사용합니다.
그런데 QueryDsl에서는 java 코드다보니 사용하기가 좀 쉽지는 않은데요, 기본적인 사용법들과 한계점, 주의할 것들을 알아보겠습니다.
QueryDsl 에서 서브 쿼리는 com.querydsl.jpa.JPAExpressions 을 사용해서 작성하면 됩니다.
나이가 가장 많은 회원 조회 테스트 코드를 작성해보겠습니다.
@BeforeEach
void setUp() {
queryFactory = new JPAQueryFactory(em);
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
}
@DisplayName("나이가 가장 많은 회원 조회")
@Test
void subQuery() {
QMember memberSub = new QMember("memberSub");
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(
JPAExpressions
.select(memberSub.age.max())
.from(memberSub)
))
.fetch();
assertThat(result)
.extracting("age")
.containsExactly(40);
}
서브 쿼리에서 member 를 또 사용하기 때문에 별칭이 겹칩니다. 그래서 추가적으로 QMember를 생성해야 합니다.
→ 참고
JPAExpressions
실행해서 쿼리를 확인해봅시다.