🔽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를 사용하면 된다.
'인프런 김영한 강의 정리 > 실전! 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 |