지금까지 fetchOne()해서 단건 조회만 함
fetch() // 리스트 조회, 데이터 없으면 빈 리스트 반환
fetchOne() // 단건 조회, 데이터 없으면 null, 결과가 둘 이상이면 Exception
fetchFirst() // limit(1).fetchOne(), 즉 처음 페이지의 맨처음 데이터 단건만 조회
fetchResults() // 페이징 정보 포함, total count 쿼리 추가 실행. 즉 페이징하고 페이징 데이터 포함 객체 가져오기 용
fetchCount() // count 쿼리 날려서 count만 조회.
일단은 fetch(), fechOne(), fetchFirst()
List<Member> fetch = query.selectFrom(m).fetch();
Member fetchOne = query.selectFrom(m).where(m.username.eq("member1")).fetchOne();
Member fetchFirst = query.selectFrom(m).fetchFirst();
//fetch
/* select
member1
from
Member member1 */ select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
//fetchOne
/* select
member1
from
Member member1
where
member1.username = ?1 */ select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
where
m1_0.username=?
//fetchFirst
/* select
member1
from
Member member1 */ select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
fetch
first ? rows only
다 생각했던 데로 들어간다.
그 다음 fetchResult()
QueryResults<Member> result = query.selectFrom(m).fetchResults();
앞서 fetchResult()는 페이징 객체로 감싸서 가져온다고 했다. count, 현재 페이지 번째 등의 페이징에 관한 정보를 가지고 있는 객체로 DB의 데이터들을 감싸서 가져온다.
그래서
/* select
count(member1)
from
Member member1 */ select
count(m1_0.member_id)
from
member m1_0
/* select
member1
from
Member member1 */ select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
이렇게 쿼리가 2번 나간다.
카운트 쿼리랑, 데이터 가져오는 쿼리.
아예 카운트만 가져오는 쿼리메소드도 있다.(편의 상 이제 QueryDSL의 쿼리 관련 메소드들을 쿼리메소드라고 부름)
long total = query.selectFrom(m).fetchCount();
/* select
count(member1)
from
Member member1 */ select
count(m1_0.member_id)
from
member m1_0
참고로 근데, 이거 fetchResults() 와 fetchCount()가 deprecated되었다.
강의에서도 경고하는데, 쿼리가 복잡해지면 total count가 다를 수 있다 그러는데,
그러니까 그냥 다른 것들이랑 left join등을 해서 가져올 경우 데이터가 뻥튀기 되거나 그럴 수도 있다는 거다.
이거는 Spring Data JPA에서 배울때도 페이징 할 때 카운트 쿼리는 join해서 가져올 경우 따로 만들 수도 있다는 걸 이야기 했다
https://qwefdg3.tistory.com/881
끝에서 약간 위쪽
이제 QueryDSL이 권장하는 것은 fetchResults()와 fetchCount()를 쓰지 말고,
그냥 fetch()로 가져오고 fetch().size()로 알으라는 거다.
나중에 따로 페이징에 대해 더 배울 것이다.
'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글
12. 페이징 (0) | 2023.11.28 |
---|---|
11. 정렬 (0) | 2023.11.28 |
9. 검색 조건 쿼리 (0) | 2023.11.28 |
8. Q타입 (0) | 2023.11.28 |
7. JPQL vs QueryDSL (0) | 2023.11.28 |