QueryDsl 기본 페이징과 정렬
QItem item = QItem.item;
query.from(item)
.where(item.price.gt(20000))
.orderBy(item.price.desc(), item.stockQuantity.asc())
.offset(10).limit(20)
.list(item);
- 위 코드는 영한님의 책에서 발췌한 코드이다
- 위 코드는
QueryDSL에서
JPAQuery.list
메서드가 제거된 것은 QueryDSL이 3.x 라인에서 4.x 라인으로 업그레이드될 때 발생한 변경사항이었습니다. 따라서, 4.0.4 버전을 사용 중이시라면list
메서드는 더 이상 사용할 수 없습니다.4.x 버전은 코드 베이스에 많은 주요 변경 사항을 도입하여 이전 코드와의 호환성이 떨어지는 것으로 알려져 있습니다. 이에 대해 다음과 같은 두 가지 옵션이 있습니다:
- 3.x 라인의 마지막 버전인 3.6.8로 다운그레이드하여
list
메서드를 사용합니다.
- 4.0.4 버전을 계속 사용하되,
fetch
메서드를 대신 사용합니다. 이와 관련된 변경 사항 목록은 GitHub 이슈에서 확인할 수 있습니다.
- 3.x 라인의 마지막 버전인 3.6.8로 다운그레이드하여
- 이러한 변경점이 있었기에 ( 옛날 책이라.. )
- 지금은 QueryDsl 5 버전에 맞게 수정해야한다.
@BeforeEach
public void beforeEach() {
qf = new JPAQueryFactory(em);
List<Item> items = new ArrayList<>();
for (int i = 0; i < 50; i++) {
items.add(new Item("item" + i, i * 1000, i));
}
itemRepository.saveAll(items);
}
@Test
public void defaultPagingAndSort() {
QItem item = QItem.item;
List<Item> items = qf.selectFrom(item)
.where(item.price.gt(2000))
.orderBy(item.price.desc(), item.stockQuantity.asc()) // 정렬
// 페이징
.offset(10) // 시작지점
.limit(20) // 데이터 수 제한
.fetch();
System.out.println("items = " + items);
}
items = [Item(id=40, name=item39, price=39000, stockQuantity=39), Item(id=39, name=item38, price=38000, stockQuantity=38), Item(id=38, name=item37, price=37000, stockQuantity=37), Item(id=37, name=item36, price=36000, stockQuantity=36), Item(id=36, name=item35, price=35000, stockQuantity=35), Item(id=35, name=item34, price=34000, stockQuantity=34), Item(id=34, name=item33, price=33000, stockQuantity=33), Item(id=33, name=item32, price=32000, stockQuantity=32), ...
- 어지러워 보이긴하는데
- 일단 가격이 2000 초과인 친구중
- 가격순으로 내림차순
- 2순위 정렬로 재고 오름차순
- 데이터는 10번쨰부터 20개를 잘라서 들고온다. 는 의미
select i1_0.id,i1_0.name,i1_0.price,i1_0.stock_quantity
from item i1_0
where i1_0.price>2000
order by i1_0.price desc,i1_0.stock_quantity asc
limit 10,20;
QueryModifiers 를 통한 페이징과 정렬
`@Test
public void queryModifiers() {
QueryModifiers queryModifiers = new QueryModifiers(10L, 20L);
qf.selectFrom(item)
.restrict(queryModifiers)
.fetch();
}
select i1_0.id,i1_0.name,i1_0.price,i1_0.stock_quantity from item i1_0 limit 20,10;
- QueryModifiers
- 는 페이징 정보는 담는 객체이며
- 파라미터
- 1번
- limit
- 2번
- offset입니다.
- 1번
listResult 를 사용하여.. 페이징과 총 데이터 수 조회
- listResult 도 쿼리 DSL 3 → 4 로 올라갈때 없어진 메서드다.
- 4에서는 fetchResults 가 등장했는데
- 이 마저도 5에서
- 이다..
- 그럼 뭐로 대체되는거야?
는 여기 게시물을 참고하자
- 결론만 얘기하면 count 쿼리를 따로 만들어서 날리라고한다.
- 조인 과 그룹바이의 경우 오류가 나는 경우가 있어서 이젠 사용하면 안된다고 생각한다.
- 일단
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
QItem item = QItem.item;
// 총 데이터 수 조회
long total = queryFactory.selectFrom(item)
.where(item.price.gt(10000))
.fetchCount();
// 페이징된 데이터 조회
List<Item> items = queryFactory.selectFrom(item)
.where(item.price.gt(10000))
.orderBy(item.price.desc())
.offset(10)
.limit(20)
.fetch();
- 이런식으로 사용하도록 하자.
Uploaded by N2T
'자바 > QueryDsl' 카테고리의 다른 글
[DataJpa] 데이터 JPA 공통 인터페이스 (0) | 2023.11.15 |
---|---|
[DataJpa] 쿼리 메서드 기능 (0) | 2023.11.15 |
[DataJpa] Named Query (0) | 2023.11.15 |
[DataJpa] Named Query (0) | 2023.11.15 |
[QueryDSL] 그룹과 조인 (0) | 2023.11.15 |