QueryDSL 5.x中使用limit/offset时如何获取总记录数?
QueryDSL 5.x 分页时获取总记录数的正确方式
首先明确:不能直接在已添加limit()/offset()的查询上调用fetchCount()——因为此时查询已经被分页限制,返回的只是当前页的记录数,而非符合条件的完整总数。
正确的操作步骤是拆分查询:
- 先构建包含
distinct()、where()过滤条件的基础查询(无需添加limit()、offset()、orderBy(),排序不影响总数,去掉能提升计数查询的性能) - 用这个基础查询调用
fetchCount()获取总记录数 - 再基于基础查询添加
orderBy()、limit()、offset(),执行查询获取当前页的数据
适配QueryDSL 5.x的代码示例
// 1. 构建基础查询(保留过滤、去重逻辑,去掉分页和排序) JPAQuery<Tuple> baseQuery = new JPAQuery<>(entityManager) .distinct() .from(qCamera) .where(/* 你的过滤条件 */); // 2. 获取符合条件的完整总记录数 long totalResults = baseQuery.fetchCount(); // 3. 基于基础查询添加分页和排序,获取当前页数据 List<Tuple> dataTuple = baseQuery .orderBy(order) .limit(pageSize) .offset((long) pageNum * pageSize) .fetch(); // QueryDSL 5.x 用fetch()替代旧版的list()
关键注意点
- 基础查询必须保留
distinct()和where()条件,否则计数结果会和实际分页查询的匹配结果不一致 - 若使用Spring Data QueryDSL集成,也可借助
QuerydslPredicateExecutor的count(Predicate)方法统计,但核心逻辑仍是基于过滤条件而非分页后的查询
内容的提问来源于stack exchange,提问作者Joseph Larson
相关产品推荐
相关产品推荐

