You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring JPA分页查询第二页无结果问题求助

JPA分页接口调用异常排查与修复

问题场景

使用JPA实现REST接口的分页功能,通过Cucumber测试:

  • 在H2数据库插入3条部门为science的员工记录
  • 两次调用/getEmployee接口:
    1. /getEmployee?dept=science&pageNo=0&pageSize=2:正常返回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);
}

问题根源

  1. DAO方法返回类型错误:findByDepartment返回List<Employee>,传入Pageable参数时,Spring Data JPA无法构建包含总页数、总记录数的完整Page对象,导致分页元数据计算错误,出现页码越界提示。
  2. 参数默认值不合理:pageSize默认值设为0,会触发分页逻辑异常。
  3. 代码笔误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:07:27