Query Builder - SubQuery Join - eq & goe

2023. 5. 21. 00:11·📦 Database/QueryDSL

SubQuery Join

com.querydsl.jpa.JPAExpressions을 사용합니다.

Subquery Join은 하위 쿼리를 사용하여 조인을 수행하는 방식입니다.

Subquery Join을 사용하면 메인 쿼리와 서브쿼리 사이에 조인을 수행할 수 있습니다.

이를 통해 복잡한 조인 조건이나 필터링 작업을 수행할 수 있습니다.


eq()

/**  @desc SubQuery Join - eq 사용 */
@Test  
fun subQueryJoin() {  
    val m = QMember.member  
    val sub = QMember("sub")  

    val result = queryFactory  
        .selectFrom(m)  
        .where(m.age.eq(JPAExpressions  
            .select(sub.age.max())  
            .from(sub)  
        ))  
        .fetch()  

    assertThat(result).extracting("age").containsExactly(40)  
}

위의 코드는 Subquery Join을 사용하여 나이가 가장 많은 멤버를 조회하는 예제입니다.

subQueryJoin() 함수에서는 Member와 sub라는 별칭으로 사용할 서브쿼리용 QMember 인스턴스를 생성합니다.


주어진 쿼리에서는

selectFrom(m)을 통해 Member 엔티티를 조회하고,

where() 절에서 m.age.eq()를 사용하여 나이가 서브쿼리의 최댓값과 일치하는 멤버를 찾습니다.


이때, 서브쿼리에서는 JPAExpressions.select()를 사용하여 sub.age.max()를 조회하고, from(sub)를 통해 sub를 서브쿼리의 별칭으로 지정합니다.

fetch() 메서드를 호출하여 쿼리를 실행하고 결과를 가져옵니다.

이 결과는 나이가 가장 많은 멤버의 리스트일 것입니다.


마지막으로 assertThat() 메서드를 사용하여 결과를 검증합니다.

extracting("age")을 통해 결과 리스트에서 "age" 속성만 추출하고,

containsExactly(40)을 통해 추출한 속성 값이 40인지 확인합니다.


즉, 나이가 가장 많은 멤버의 나이가 40인지를 검증하는 것입니다.

따라서 위의 코드는 Subquery Join을 사용하여 나이가 가장 많은 멤버를 조회하고, 그 나이가 40인지를 확인하는 예제입니다.


goe

/** @desc SubQuery Join - geo 사용 */
@Test  
fun subQueryJoinGoe() {  
    val m = QMember.member  
    val sub = QMember("sub")  

    val result = queryFactory  
        .selectFrom(m)  
        .where(m.age.goe(JPAExpressions  
            .select(sub.age.avg())  
            .from(sub)  
        ))  
        .fetch()  

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

위의 코드는 Subquery Join을 사용하여 평균 나이보다 크거나 같은 멤버를 조회하는 예제입니다.

subQueryJoinGoe() 함수에서는 Member와 sub라는 별칭으로 사용할 서브쿼리용 QMember 인스턴스를 생성합니다.


주어진 쿼리에서는 selectFrom(m)을 통해 Member 엔티티를 조회하고,

where() 절에서 m.age.goe()를 사용하여 나이가 서브쿼리의 평균값보다 크거나 같은 멤버를 찾습니다.


이때, 서브쿼리에서는 JPAExpressions.select()를 사용하여 sub.age.avg()를 조회하고, from(sub)를 통해 sub를 서브쿼리의 별칭으로 지정합니다.

fetch() 메서드를 호출하여 쿼리를 실행하고 결과를 가져옵니다.

이 결과는 평균 나이보다 크거나 같은 멤버의 리스트일 것입니다.


마지막으로 assertThat() 메서드를 사용하여 결과를 검증합니다.

extracting("age")을 통해 결과 리스트에서 "age" 속성만 추출하고,

containsExactly(30, 40)을 통해 추출한 속성 값이 30과 40인지 확인합니다.


즉, 평균 나이보다 크거나 같은 멤버의 나이가 30과 40인지를 검증하는 것입니다.

따라서 위의 코드는 Subquery Join을 사용하여 평균 나이보다 크거나 같은 멤버를 조회하고, 그 나이가 30과 40인지를 확인하는 예제입니다.


저작자표시 (새창열림)

'📦 Database > QueryDSL' 카테고리의 다른 글

간단한 조건 검색 (필터링, 상세검색) 기능 만들기 (Kotlin, QueryDSL)  (1) 2023.06.25
Query Builder - Inner & Outer & Cross Join  (0) 2023.05.20
Query Builder - Aggregation & Group By & Having  (0) 2023.05.20
Query Builder - Sort, Paging  (0) 2023.05.20
Query Builder - 검색 조건 쿼리  (0) 2023.05.20
'📦 Database/QueryDSL' 카테고리의 다른 글
  • 간단한 조건 검색 (필터링, 상세검색) 기능 만들기 (Kotlin, QueryDSL)
  • Query Builder - Inner & Outer & Cross Join
  • Query Builder - Aggregation & Group By & Having
  • Query Builder - Sort, Paging
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      GStreamer #Pipeline
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Query Builder - SubQuery Join - eq & goe
    상단으로

    티스토리툴바