Post

[Querydsl] 서브쿼리(SubQuery)

QueryDSL - 서브쿼리: 데이터베이스를 더 효과적으로 활용하기

안녕하세요! 오늘은 QueryDSL에서 제공하는 서브쿼리에 대해 알아보겠습니다. 서브쿼리는 주 쿼리 안에서 또 다른 쿼리를 실행하는 기술로, 데이터베이스를 더 효과적으로 활용하는 데에 도움을 줍니다. 간단한 설명과 함께 다양한 서브쿼리의 활용 예시 코드를 살펴봅시다.

서브쿼리란?


서브쿼리는 하나의 SQL 문 안에서 또 다른 SQL 문을 실행하는 것을 의미합니다. QueryDSL에서는 서브쿼리를 통해 복잡한 조건을 간단하게 처리하고자 할 때 사용됩니다.

단일 결과 서브쿼리


서브쿼리가 반환하는 결과가 하나인 경우에 사용됩니다.

예시 코드

1
2
3
4
5
6
7
8
9
10
QMember subMember = new QMember("subMember");

List<Member> members = new JPAQueryFactory(entityManager)
    .selectFrom(member)
    .where(member.age.eq(
        new JPASubQuery().select(subMember.age.max()).from(subMember)
    ))
    .fetch();

위 코드에서는 Member 테이블에서 age가 최대인 회원을 찾아와서 해당 나이와 동일한 회원을 찾아옵니다.

다중 결과 서브쿼리


서브쿼리가 여러 결과를 반환하는 경우에 사용됩니다.

예시 코드

1
2
3
4
5
6
7
8
9
10
QOrder subOrder = new QOrder("subOrder");

List<Order> orders = new JPAQueryFactory(entityManager)
    .selectFrom(order)
    .where(order.orderAmount.gt(
        new JPASubQuery().select(subOrder.orderAmount.avg()).from(subOrder)
    ))
    .fetch();

위 코드에서는 Order 테이블에서 주문 금액이 평균 이상인 주문을 찾아옵니다.

exists 서브쿼리


exists 키워드를 사용하여 서브쿼리의 결과의 존재 여부를 확인할 수 있습니다.

예시 코드

1
2
3
4
5
6
7
8
9
10
QMember subMember = new QMember("subMember");

List<Member> members = new JPAQueryFactory(entityManager)
    .selectFrom(member)
    .where(new JPASubQuery().from(subMember)
        .where(subMember.team.eq(member.team))
        .exists())
    .fetch();

위 코드에서는 Member 테이블에서 동일한 팀에 속한 회원이 있는 경우에만 결과를 가져옵니다.

📌주의사항과 팁


  • 서브쿼리를 사용할 때는 결과가 어떤 형태로 나올지 고려하여 주어진 상황에 맞게 적절한 방식을 선택해야 합니다.
  • 서브쿼리의 결과가 너무 많아질 경우 성능에 영향을 줄 수 있으므로 주의가 필요합니다.
  • 필요에 따라 exists, notExists 등을 활용하여 존재 여부를 확인할 수 있습니다.
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.