[Querydsl] fetchResults(), fetchCount() 대체하기

2024. 8. 7. 23:34· 인프런 김영한 강의 정리/실전! Querydsl
목차
  1. 1. fetchResults(), fetchCount() 역할
  2. 2. 지원하지 않는 이유
  3. 3. fetchResults(), fetchCount() 대체법
728x90

🔽Querydsl의 미지원 API 목록 링크

 

Deprecated List (Querydsl 5.0.0 API)

JavaScript is disabled on your browser. Deprecated Methods  Method and Description com.querydsl.sql.codegen.NamingStrategy.appendSchema(String, String) com.querydsl.jpa.impl.AbstractJPAQuery.fetchCount() com.querydsl.jpa.impl.AbstractJPAQuery.fetchResults

querydsl.com

1. fetchResults(), fetchCount() 역할

▪️ fetchResults() : 페이징 처리된 결과 리스트, 전체 결과 수(페이징 전)를 반환하는 메서드.

▪️  fetchCount() : 쿼리의 결과 행(row)수를 반환 하는 메서드.

 

2. 지원하지 않는 이유

fetchResults()와 fetchCount() 모두 Querydsl 내부에서 count 쿼리를 만들어서 실행해야 하는데, 이 때 작성한 select 쿼리 기반으로 count 쿼리를 만든다.  ->   SELECT COUNT(*) FROM (<original query>) 

지원하던 때에도 단순한 쿼리에서는 카운트가 잘 되는데, GROUP BY나 HAVING절이 포함되는 복잡한 쿼리에서는 잘 작동하지 않았던 메서드였다.

그리고 이 메서드를 실행하면 메모리에서 카운트를 생성하기 때문에 큰 결과 집합에서는 성능에 문제가 생길 수 있다고 한다.

 

3. fetchResults(), fetchCount() 대체법

count 쿼리를 별도로 작성해야 한다.

 

✅ fetchResults() 사용 코드

import static study.querydsl.entity.QBook.book;

public class BookRepositoryImpl implements BookRepository {
    
    @Autowired
    EntityManager em;
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    @Override
    public QueryResults<Book> searchBooks(String keyword, int offset, int limit) {
        return queryFactory
            .selectFrom(book)
            .where(book.title.contains(keyword)
                .or(book.author.contains(keyword)))
            .orderBy(book.title.asc())
            .offset(offset)
            .limit(limit)
            .fetchResults();
    }
}

이전 버전에서는 페이징된 결과와 전체 레코드 수를 QueryResults로 한 번에 가져왔다.

이제는 fetch()와 count()를 분리해줘야한다.

 

✅fetchResults() 대체 후 코드

import static study.querydsl.entity.QBook.book;

public class BookRepositoryImpl implements BookRepository {
    
    @Autowired
    EntityManager em;
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    @Override
    public List<Book> searchBooks(String keyword, int offset, int limit) {
        return queryFactory
            .selectFrom(book)
            .where(book.title.contains(keyword)
                .or(book.author.contains(keyword)))
            .orderBy(book.title.asc())
            .offset(offset)
            .limit(limit)
            .fetch();
    }
    
    @Override
    public long countBooks(String keyword) {
        return queryFactory
            .select(book.count()) 
            .from(book)
            .where(book.title.contains(keyword)
                .or(book.author.contains(keyword)))
            .fetchOne();//응답 결과는 하나니까 fetchOne 사용
    }
}

이렇게 페이징된 결과와 전체 레코드 수를 각각 분리해서 처리해야한다.

 

✅fetchCount() 사용 코드

@Test
public void count() {
    Long totalCount = queryFactory
    .selectFrom(member)
    .fetchCount();
    
    System.out.println("totalCount = " + totalCount);
}

 

✅fetchCount() 대체 후 코드

@Test
public void count() {
    Long totalCount = queryFactory
        .select(member.count())
        .from(member)
        .fetchOne();
    
    System.out.println("totalCount = " + totalCount);
} 

카운트 결과는 단건조회기 때문에 fetchOne()을 사용한다.

참고로 count(*)을 사용하고 싶을 때는 Wildcard.count를 사용하면 된다.

728x90

'인프런 김영한 강의 정리 > 실전! Querydsl' 카테고리의 다른 글

[Querydsl] 기본 문법(4) - Case문  (0) 2024.08.09
[Querydsl]기본 문법(3) - 서브 쿼리  (0) 2024.08.09
[Querydsl] 기본 문법(2) - 조인  (0) 2024.08.08
[Querydsl] 기본 문법(1) - JPQL과 차이, 조회  (0) 2024.08.06
프로젝트 환경설정 (SpringBoot 3.x 버전), Querydsl 설정  (0) 2024.07.27
  1. 1. fetchResults(), fetchCount() 역할
  2. 2. 지원하지 않는 이유
  3. 3. fetchResults(), fetchCount() 대체법
'인프런 김영한 강의 정리/실전! Querydsl' 카테고리의 다른 글
  • [Querydsl]기본 문법(3) - 서브 쿼리
  • [Querydsl] 기본 문법(2) - 조인
  • [Querydsl] 기본 문법(1) - JPQL과 차이, 조회
  • 프로젝트 환경설정 (SpringBoot 3.x 버전), Querydsl 설정
백엔드 개발자 - 젤리곰
백엔드 개발자 - 젤리곰
오늘도 배움이 있는 하루가 되길 바라는 개발자
백엔드 개발자 - 젤리곰
backend-gummyBear
백엔드 개발자 - 젤리곰
전체
오늘
어제
  • 분류 전체보기 (145) N
    • 인프런 김영한 강의 정리 (60)
      • 스프링 핵심원리 기본편 (12)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 (10)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (3)
      • 자바 ORM 표준 JPA 프로그래밍 기본편 (28)
      • 실전! Querydsl (6)
    • Spring (2)
    • 프로젝트일지 (6)
    • 프로그래밍 언어 (20)
      • Java (17)
      • JavaScript (3)
      • Python (0)
    • 데이터베이스 (4)
      • Oracle (2)
      • ORM (1)
      • SQL 튜닝 (1)
    • 형상관리 (1)
      • Git (0)
    • 알고리즘&자료구조 (34)
      • Algorithm (31)
      • Data Structure (1)
    • CS지식 (4)
    • Cloud (5)
    • 일기 (8) N
      • 공부 일기 (3)
      • 독서 일기 (2)
      • 마음 일기 (3) N

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 다운캐스팅
  • 스프링컨텍스트
  • dfs알고리즘
  • LeetCode17번
  • ORM프레임워크
  • 데이터베이스정규화
  • 객체지향의사실과오해
  • 업캐스팅
  • 프론트엔드개발자업무
  • 인프콘
  • 커스텀annotation
  • #{}와${}의차이
  • SublimeText단축키
  • 클라이언트서버통신
  • jquery와javascript
  • 힙자료구조
  • 인터페이스
  • LeetCode200번
  • 프론트엔드역사
  • 객체지향방법론

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
백엔드 개발자 - 젤리곰
[Querydsl] fetchResults(), fetchCount() 대체하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.