Query Builder - Sort, Paging

2023. 5. 20. 20:18·📦 Database/QueryDSL

💡 Sort

desc(), asc() : 일반 정렬
nullsLast(), nullsFirst() : null 데이터에 순서 부여

/**  
 * 회원 정렬 순서  
 * 1. 회원 나이 내림차순 (desc)
 * 2. 회원 이름 올림차순 (asc) 
 * 단 2에서 회원 이름이 없으면 마지막에 출력 (nulls test) 
 * */
@Test  
fun sort() {  
    val m: QMember = QMember.member  

    em.persist(Member(null, 100))  
    em.persist(Member("member5", 100))  
    em.persist(Member("member6", 100))  

    val result = queryFactory  
        .selectFrom(m)  
        .where(m.age.eq(100))  
        .orderBy(m.age.desc(), m.name.asc().nullsFirst())  
        .fetch()  

    val member5 = result.get(0)  
    val member6 = result.get(1)  
    val memberNull = result.get(2)  
    assertThat(member5.name).isEqualTo("member5")  
    assertThat(member6.name).isEqualTo("member6")  
    assertThat(memberNull.name).isNull()  

}

💡 Paging

count 쿼리가 실행되니 성능상 주의가 필요하다.

참고

실무에서 페이징 쿼리를 작성할 때, 데이터를 조회하는 쿼리는 여러 테이블을 조인해야 하지만,

count 쿼리는 조인이 필요없는 경우도 있다.

그런데 이렇게 자동화된 count 쿼리는 원본 쿼리와 같이 모두 조인을 해버리기 때문에 성능이 안 나올수 있다.

count 쿼리에 조인이 필요없는 성능 최적화가 필요하다면, count 전용 쿼리를 별도로 작성해야 한다.


조회 건 수 제한

/** @desc 페이징 - 조회 건수 제한 */
@Test  
fun paging1() {  
    val m: QMember = QMember.member  

    val result = queryFactory  
        .selectFrom(m)  
        .orderBy(m.name.desc())  
        .offset(1)  
        .limit(2)  
        .fetch()  

    assertThat(result.size).isEqualTo(2)  
}

전체 조회수가 필요할 때

/** @desc 페이징 - 전체 조회 수가 필요할 때 */@Test  
fun paging2() {  
    val m: QMember = QMember.member  

    val result = queryFactory  
        .selectFrom(m)  
        .orderBy(m.name.desc())  
        .offset(1)  
        .limit(2)  
        .fetchResults()  

    assertThat(result.total).isEqualTo(4)  
    assertThat(result.limit).isEqualTo(2)  
    assertThat(result.offset).isEqualTo(1)  
    assertThat(result.results).size().isEqualTo(2)  
}

저작자표시 (새창열림)

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

Query Builder - Inner & Outer & Cross Join  (0) 2023.05.20
Query Builder - Aggregation & Group By & Having  (0) 2023.05.20
Query Builder - 검색 조건 쿼리  (0) 2023.05.20
Query Builder - JPQL vs QueryDsl  (0) 2023.05.20
Query Builder - 초기 설정  (2) 2023.05.20
'📦 Database/QueryDSL' 카테고리의 다른 글
  • Query Builder - Inner & Outer & Cross Join
  • Query Builder - Aggregation & Group By & Having
  • Query Builder - 검색 조건 쿼리
  • Query Builder - JPQL vs QueryDsl
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (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
    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Query Builder - Sort, Paging
    상단으로

    티스토리툴바