Querydsl - 分页功能

问题描述 投票:1回答:1

似乎在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不支持复杂的“order by”子句,我无法使用它:(

querydsl
1个回答
1
投票

在这里太晚了,但有人可能会发现它有用。

这是最佳方法吗? fetchResults是否仅从DB加载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个查询,以通过指定的页面大小和偏移量来获取结果“有限”。

© www.soinside.com 2019 - 2024. All rights reserved.