Spring JPA分页查询第二页无结果问题求助
JPA分页接口调用异常排查与修复
问题场景
使用JPA实现REST接口的分页功能,通过Cucumber测试:
- 在H2数据库插入3条部门为
science的员工记录 - 两次调用
/getEmployee接口:/getEmployee?dept=science&pageNo=0&pageSize=2:正常返回2条记录/getEmployee?dept=science&pageNo=1&pageSize=1:无结果返回,调试时提示「Page 2 of 1 containing UNKNOWN instances」
相关代码
Employees getEmployees(@RequestParam Department department , @RequestParam( defaultValue="0") pageNo, @RequestParam( defaultValue="0") pageSize) { var criteria = new Criteria(pagNo, pageSize); employeeRepository.findBy(department, criteria); } Employees findBy(Department department, Criteria criteria) { var pageable = criteria == null ? Pageable.unpaged(): PageRequest.of(criteria.PageNo(), criteria.pageSize()); var pagedEmployees = employeeDAO.findByDepartment( department.toString(),pageable) return pagedEmployees.getContent(); } public interface EmployeeDAO extends JPARepositiry<Employee, UUID>{ List<Employee> findByDepartment(String department, Pageable pageable); }
问题根源
- DAO方法返回类型错误:
findByDepartment返回List<Employee>,传入Pageable参数时,Spring Data JPA无法构建包含总页数、总记录数的完整Page对象,导致分页元数据计算错误,出现页码越界提示。 - 参数默认值不合理:
pageSize默认值设为0,会触发分页逻辑异常。 - 代码笔误:
getEmployees中创建Criteria时使用了错误的参数名pagNo(应为pageNo);JPARepositiry拼写错误(应为JpaRepository),导致仓库接口无法正确继承Spring Data规范。
修复方案
1. 修正DAO接口返回类型
将findByDepartment返回类型改为Page<Employee>,让Spring Data自动处理分页元数据:
public interface EmployeeDAO extends JpaRepository<Employee, UUID> { Page<Employee> findByDepartment(String department, Pageable pageable); }
2. 修正业务层分页逻辑
确保分页参数正确传递,同时保留分页元数据的正确性:
Employees findBy(Department department, Criteria criteria) { var pageable = criteria == null ? Pageable.unpaged() : PageRequest.of(criteria.pageNo(), criteria.pageSize()); var pagedEmployees = employeeDAO.findByDepartment(department.toString(), pageable); return pagedEmployees.getContent(); }
若需向前端返回分页元数据(总页数、总记录数等),建议将
Employees改为包含分页信息的DTO,而非仅返回列表内容。
3. 修正请求参数默认值
将pageSize默认值改为合理数值(如10),避免分页大小为0的异常:
Employees getEmployees(@RequestParam Department department , @RequestParam(defaultValue = "0") int pageNo, @RequestParam(defaultValue = "10") int pageSize) { var criteria = new Criteria(pageNo, pageSize); // 修正笔误pagNo为pageNo return employeeRepository.findBy(department, criteria); }
4. 修复拼写错误
- 将
JPARepositiry改为JpaRepository - 将
pagNo修正为pageNo
验证逻辑
修复后,3条数据的场景下:
- 调用
/getEmployee?dept=science&pageNo=0&pageSize=2:返回第1页(0-based)的2条记录,总页数为2 - 调用
/getEmployee?dept=science&pageNo=1&pageSize=1:返回第2页(0-based)的1条记录,无页码越界提示
内容的提问来源于stack exchange,提问作者BobCoder
相关产品推荐
相关产品推荐

