Querydsl - 分页功能

时间:2016-08-04 21:27:37

标签: querydsl

似乎在Jpa QueryDsl中我可以使用分页:

return new JPAQueryFactory(getEntityManager())
    .selectFrom(entity)
    .where(where_clause)
    .orderBy(order_by_clause)
    .offset(pageNumber * 20)
    .limit(20)
    .fetchResults();

问题是:

  • 这是最佳方法吗? fetchResults是否只从DB加载20个元素并使计数查询获取有关db中实体总数的信息?
  • 或许有一些选项,如.page(2).limit(20)?

是的我知道Spring-Data已经为QueryDsl提供了Paging和接口,但由于复杂的"顺序由" Spring-Data不支持的子句我不能使用它:(

2 个答案:

答案 0 :(得分:0)

在这里为时已晚,但有人可能会有所帮助。

  

这是最佳方法吗? fetchResults是否仅从数据库中加载20个元素并进行计数查询以获取有关db中实体总数的信息?

是-它将发出2个查询。一个用于计数where子句,另一个用于获取结果。当您有兴趣了解满足条件(where子句)的记录数以及根据页面大小和偏移量获取数据时,这是理想的。使用.fetchResults()时,应使用以下方法获取总数和返回的行,如下所示。

QueryResults<Tuple> result = query.fetchResults();
int totalCount = result.getTotal();
List<Tuple> rows = result.getResults();
  

或者也许有一些选项,例如.page(2).limit(20)?

是-如果您只想获取偏移量和页面大小的结果,则应使用

List<Tuple> rows = query.limit(20).offset(2*20).fetch();

fetch()方法将仅发出1条查询以获取受“页面大小”和指定的偏移量“限制”的结果。

答案 1 :(得分:0)

Querydsl.applyPagination() 也可以使用。

org.springframework.data.domain.PageImpl;
org.springframework.data.domain.Pageable;

Querydsl querydsl = new Querydsl(entityManager, (new PathBuilderFactory()).create(<EntityClass>.class));
JPQLQuery<?> query = new JPAQuery<>(entityManager);

//TODO: prepare your query here 

//Get the count
Long totalElements = query.fetchCount();

//Apply the pagination
List<?> result = querydsl.applyPagination(pageable, query).fetch();

//return a paged response
return new PageImpl<>(result, pageable, totalElements);