아래의 표는 querydsl의 결과를 조회해오는 여러 함수들을 정리한 표이다.
| 함수 | 내용 | 결과 없을 경우 | 추가 내용 |
|---|---|---|---|
| fetch( ) | 리스트 조회 | [ ] (빈리스트 반환) | |
| fetchOne( ) | 단 건 조회 | null | 결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException 에러 발생 |
| fetchFirst( ) | limit(1).fetchOne( ) | ||
| fetchResults( ) | 페이징 정보 포함 | total Count 쿼리 추가 실행 | |
| fetchCount( ) | count 쿼리로 변경해서 count 수 조회 |
페이징 X
fetch()fetchOne()페이징 O
fetchResults()fetchFirst()count 쿼리
fetchCount() /**
* 결과 조회 쿼리
*/
@Test
public void resultFetch() {
// 1. fetch() : 리스트 조회
List<Member> fetch = queryFactory
.selectFrom(member)
.fetch();
// 2. fetchOne() : 단 건 조회
Member fetchOne = queryFactory
.selectFrom(member)
.fetchOne();
// 3. fetchFirst() : 처음 1개 조회
Member fetchFirst = queryFactory
.selectFrom(member)
.fetchFirst();// .limit(1).fetchOne()과 같음
// 4. fetchResults() : 페이징 정보 포함. total count 쿼리까지 총 쿼리 2방 나감
// 쿼리 2방 나감 (total count 가져와야해서)
QueryResults<Member> results = queryFactory
.selectFrom(member)
.fetchResults();
// 페이징 관련 함수들 사용 가능
results.getTotal();
List<Member> content = results.getResults(); // contents 꺼내기
results.getLimit(); // 쿼리에 쓰인 limit 값 가져오기
// 5. fetchCount() : count쿼리로 변경해서 count 수 조회
long total = queryFactory
.selectFrom(member)
.fetchCount();
}
- count 쿼리
memberId만 select- contents 가져오는 쿼리
모든 데이터 다 select
실제로 실행된 쿼리

count 쿼리만 실행된다.
즉, 쿼리 한방만 나간다.
실제로 실행된 쿼리

JPQL에서 엔티티 직접 지정시 SQL의 count 쿼리에서는 id로 변경된다.
참고
데이터를 조회하는 쿼리는 여러 테이블을 조인해야하지만, count쿼리는 조인이 필요없는 경우도 있다.
이런 경우 fetchResults() 함수가 자동적으로 생성하는 count 쿼리는 원본 쿼리와 같이 모두 조인을 해버려서 성능이 안 나올 수 있다.
실무에서는 count 쿼리에 조인이 필요없고, 성능 최적화가 필요한 경우, fetchResults를 사용하지 않고, count 전용 쿼리를 별도로 작성한다.
즉,데이터를 조회해오는 쿼리와count를 조회하는 쿼리를 별도로 작성해 실행한다.