페이징이다. 여기선 간단하게 몇번째부터 몇개까지 라고 이해하면 된다.
Spring Data JPA에서 객체로 했던 페이징은 뭐랄까 좀더 인간친화적인? 몇페이지의 몇개, 이거고,
이 QueryDSL은 자바의 쿼리 메소드를 통해 JPQL 즉, 쿼리를 만드는 것이므로, offet(몇번째부터), limit(개수)를 활용한다.
@Test
public void paging1(){
List<Member> result = query.selectFrom(m).orderBy(m.username.desc())
.offset(1)
.limit(2)
.fetch();
for (Member member : result) {
System.out.println("member = " + member.getUsername());
}
}
/* select
member1
from
Member member1
order by
member1.username desc */ select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
order by
m1_0.username desc
offset
? rows
fetch
first ? rows only
앞에 주석이 JPQL, 뒤가 실제 DB에 나가는 쿼리.
select m1_0.member_id,m1_0.age,m1_0.team_id,m1_0.username from member m1_0 order by m1_0.username desc offset 1 rows fetch first 2 rows only;
여기 보면 쿼리메소드 대로 offset 1부터, 한칸 띄우고 부터, 처음 2개 rows만 가져옴.
그리고 나온 것의 결과는
member = member3
member = member2
앞서 넣은 member1~4 중 desc로 즉 내림차순, 4는 뛰어넘어 3,2,1부터 2개 3,2를 가져옴.
@Test
public void paging2(){
QueryResults<Member> memberQueryResults = query.selectFrom(m).orderBy(m.username.desc())
.offset(1)
.limit(2)
.fetchResults();
List<Member> result = memberQueryResults.getResults();
for (Member member : result) {
System.out.println("member = " + member.getUsername());
}
System.out.println("total = " + memberQueryResults.getTotal());
System.out.println("limit = " + memberQueryResults.getLimit());
System.out.println("offset = " + memberQueryResults.getOffset());
System.out.println("fetch size = " + memberQueryResults.getResults().size());
}
fetchResults를 쓴 경우.
QueryResults란 QueryDSL이 제공해주는 페이징 객체이다.
스프링 Data JPA와 마찬가지로 페이징에 대한 정보를 같이 제공해 주는 객체이다.
이 객체로 DB에서 가져온 결과들을 한번 감싸는 것이다.
total = 4
limit = 2
offset = 1
fetch size = 2
이렇게 나온다.
근데, 이거 이제 deprecated 되었다.
앞서 말했듯이 fetchCount도 마찬가지.
왜냐하면 이게 count쿼리를 만드는, 즉 fetchCount()도 같이 실행 되는데, 그게 제대로 안 만들어 진다.
예를 들어 join 여러 개 하면 쿼리가 뻥튀기가 될 수도 있는데, 그럴 경우 얘가 쿼리를 어떻게 만들어야 할 지 모른다.
카운트 쿼리도 모두 join해서 가져와야 하나? 이러는 것 같다.
그래서 아예, 카운트 쿼리 만드는 메소드는 deprecated 시켜서 카운트 쿼리는 직접 만들도록 유도시키는 것 같다.
나중에 SpringDataJPA와 QueryDSL 페이징을 연동시키는 방법을 배우니, 페이징 객체는 그걸로 하면 될 듯.
'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글
14. join (0) | 2023.11.29 |
---|---|
13. 그룹 (0) | 2023.11.29 |
11. 정렬 (0) | 2023.11.28 |
10. 결과 조회 (0) | 2023.11.28 |
9. 검색 조건 쿼리 (0) | 2023.11.28 |