반응형
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다.
결과 조회
- fetch() : List 조회, 데이터가 없으면 빈 List 반환
- fetchOne() : 단 건 조회
- 결과가 없으면 : null
- 결과가 둘 이상이면 : NonUniqueResultException 발생
- fetchFirst() : limit(1).fetchOne()
- fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행
- fetchCount() : count 쿼리로 쿼리 변경해서 count 수 조회
fetchResults
fetch, fetchOne, fetchFirst의 경우는 굳이 실행 안해봐도 어떻게 나오는지 알테니 fetchResults부터 코드를 작성하고 실행해보자.
QueryResults<Member> results = queryFactory
.selectFrom(member)
.fetchResults();
results.getTotal();
List<Member> content = results.getResults();
페이징할 때 사용할 수 있는 코드이다. 일단 results로 조회를 해오고 getTotal()로 totalCount 쿼리를 따로 날린다. 그리고 getResults()를 하면 contents 쿼리를 날려서 contents 내용을 가져오게 된다.
// totalCount 쿼리
/* select
count(member1)
from
Member member1 */ select
count(member0_.member_id) as col_0_0_
from
member member0_
// contents 쿼리
/* select
member1
from
Member member1 */ select
member0_.member_id as member_i1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
fetchCount
count 쿼리로 변경해서 count 수를 조회한다.
long total = queryFactory
.selectFrom(member)
.fetchCount();
/* select
count(member1)
from
Member member1 */ select
count(member0_.member_id) as col_0_0_
from
member member0_
JPQL에 count(member1)로 엔티티를 직접 넘길 경우에 알아서 id로 바꿔서 조회한다. 결론은 select 절을 지우고 count 쿼리로 변경 된다.
반응형