QueryDSL 5.0.0中JPAQuery.fetchResults()已弃用,该用什么方法替代实现分页?
QueryDSL 5.0.0 分页查询替代
fetchResults()方案 QueryDSL 5.x 版本废弃JPAQuery.fetchResults()以及配套的fetchCount()方法,核心原因是两个方法自动生成的count查询逻辑通用性差,在多表关联、分组聚合等复杂场景下容易生成错误的统计SQL,官方推荐手动拆分查询实现分页逻辑。
基础实现步骤
- 首先根据业务需求定义分页参数:页码偏移量
offset和单页数据条数limit - 编写原业务查询语句,调用
offset()、limit()方法设置分页参数后执行fetch()获取当前页数据列表 - 基于相同的查询条件,单独编写count统计查询获取符合条件的总数据条数
- 自行封装总条数、当前页数据返回分页结果即可
代码示例
import static com.example.entity.QUser.user; // 替换为你自己的查询实体路径 // 分页参数示例:查询第1页,每页10条数据 int pageNum = 1; int pageSize = 10; long offset = (pageNum - 1) * pageSize; // 1. 查询当前页数据列表 List<User> userList = queryFactory.selectFrom(user) .where(user.age.gt(18), user.status.eq(1)) // 替换为你的业务查询条件 .offset(offset) .limit(pageSize) .fetch(); // 2. 单独查询符合条件的总条数 Long total = queryFactory.select(user.count()) .from(user) .where(user.age.gt(18), user.status.eq(1)) // 和业务查询条件保持一致 .fetchOne(); total = total == null ? 0 : total;
Spring Data JPA 整合场景简化方案
如果你是和Spring Data JPA 整合使用QueryDSL,可以让你的Repository接口继承QuerydslPredicateExecutor<T>接口,直接调用内置的findAll(Predicate predicate, Pageable pageable)方法,框架会自动执行分页查询和总数统计,直接返回包含完整分页信息的Page<T>对象,不需要手动拆分两次查询。
内容的提问来源于stack exchange,提问作者java001
相关产品推荐
相关产品推荐

