[QueryDSL] 페이징과 정렬

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 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입니다.

listResult 를 사용하여.. 페이징과 총 데이터 수 조회

  • listResult 도 쿼리 DSL 3 → 4 로 올라갈때 없어진 메서드다.
  • 4에서는 fetchResults 가 등장했는데
  • 이 마저도 5에서
    • 이다..
  • 일단
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