Querydsl - 결과 조회
@Test
public void resultFetch() {
// List
List<Member> fetch = queryFactory
.selectFrom(member)
.fetch();
// 단 건
Member findMember1 = queryFactory
.selectFrom(member)
.fetchOne();
// 처음 한 건 조회
Member findMember2 = queryFactory
.selectFrom(member)
.fetchFirst();
// 페이징에 사용
QueryResults<Member> results = queryFactory
.selectFrom(member)
.fetchResults();
}
fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환
fetchOne() : 단 건 조회
- 결과가 없으면 : null
- 결과가 둘 이상이면 com.querydsl.core.NonUniqueResultException
fetchFirst() : limit(1).fetchOne()
fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행
fetchCount() : count 쿼리로 변경해서 count 수 조회
페이징에 totalCount가 왜 필요하지?
https://okky.kr/articles/282819
- 이렇듯 페이징을 하기 위해 쿼리를 이리저리 짰어야 했었다.!
- 아직도 ORM을 사용하지 않는 곳은 위의 방식으로 쿼리를 짜고 있다.
- 보다보면 익숙해지지만.. 페이징을 하기 위해서는 여러 조건들이 필요하다.
- 일단 총 게시글의 개수 : totalCount
- 이게 바로 fetchResults를 사용하면서 total count 쿼리가 한 번 더 나간다. 의 의미이다.
- 페이징을 하기 위해서는 총 게시글(예) 이 필요하다.
- 그리고 한 페이지에 몇 개씩 보여줄 것인가.
- 등등
- 일단 총 게시글의 개수 : totalCount
count 쿼리를 단일로 날리는 방법
//count 쿼리로 변경
long count = queryFactory
.selectFrom(member)
.fetchCount();
**
실무에서 페이징 쿼리 작성할 때, 여러 테이블 조인해야 하지만
count 쿼리는 조인이 필요 없는 경우가 있다.
이렇게 자동화된 쿼리를 날리게 되면 원본 쿼리와 같이 모두 조인을 해버리기 때문에 성능 이슈가 있을 수 있다.
즉, count 전용 쿼리를 별도로 날리자. (성능 향상)
문제점
위의 쿼리를 스프링 부트 3.0 이상의 버전 querydsl 5.0.0 기준으로 실행해보았는데..
fetchResults() 에서 에러 메시지가 발생했다.
NonUniqueResultException: jakarta.persistence.NonUniqueResultException: Query did not return a unique result: 4 results were returned
아아
- 확인해보니 deprecated되어 아예 getResultList라는 메서드가 존재하지 않았다...
- fetchResults()는 위의 버전에서는 사용할 수 없을 것 같다.
- fetch() 메서드를 통해 쿼리를 날리는 것을 권장한다고 한다.!
'Spring관련 기술 > JPA' 카테고리의 다른 글
Querydsl - 조인 (기본 조인) (0) | 2024.01.16 |
---|---|
Querydsl - 정렬 (0) | 2024.01.16 |
Querydsl - 검색 조건 쿼리 (0) | 2024.01.16 |
Querydsl - 기본 QType 활용 (0) | 2024.01.16 |
JPQL vs Querydsl (0) | 2024.01.16 |