首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询-分页功能

查询-分页功能
EN

Stack Overflow用户
提问于 2016-08-04 21:27:36
回答 2查看 11.3K关注 0票数 9

在Jpa QueryDsl中,我似乎可以使用分页方式,例如:

代码语言:javascript
运行
复制
return new JPAQueryFactory(getEntityManager())
    .selectFrom(entity)
    .where(where_clause)
    .orderBy(order_by_clause)
    .offset(pageNumber * 20)
    .limit(20)
    .fetchResults();

问题如下:

  • 这是最优的方法吗?fetchResults是否只从db加载20个元素并进行计数查询以获取数据库中实体总数的信息?
  • 或者可能有像.page(2).limit(20)这样的选项?

是的,我知道Spring已经为QueryDsl进行了分页和接口,但是由于Spring不支持复杂的"order“子句,所以我不能使用它:(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-17 13:19:46

太晚了,但有人会发现这很有帮助。

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

是的-它将发出2次查询。一个用于使用where子句计数,另一个用于获取结果。当您感兴趣地了解符合标准(where子句)的记录数量以及根据页面大小和偏移量获取数据时,就需要这样做。使用.fetchResults()时,您应该使用以下方法来获得总计数和返回的行,如下所示。

代码语言:javascript
运行
复制
QueryResults<Tuple> result = query.fetchResults();
int totalCount = result.getTotal();
List<Tuple> rows = result.getResults();

或者可能有像.page(2).limit(20)这样的选项?

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

代码语言:javascript
运行
复制
List<Tuple> rows = query.limit(20).offset(2*20).fetch();

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

票数 16
EN

Stack Overflow用户

发布于 2021-02-10 02:08:24

Querydsl.applyPagination()也可以使用。

代码语言:javascript
运行
复制
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);
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38777670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档