Spring Boot使用PagingAndSortingRepository分页查询无返回结果问题排查
常见排查方向
- 页码起始值不匹配(最高发)
Spring Data 中PageRequest.of(page, size)的页码是从0开始计数的,如果前端传入的pageNum是按业务习惯从1开始取值,比如查询第一页传了pageNum=1,实际会查询第二页的数据。如果符合条件的总数据不足10条,第二页返回结果自然为空。
验证方式:打印doctorPage.getTotalElements()的值,如果总条数大于0但getContent()为空,基本可以确定是页码传值问题,改成PageRequest.of(Integer.parseInt(pageNum)-1, 10)即可。 - 查询条件匹配不符合预期
- 检查
Doctor实体类的属性名是否为name,如果字段加了@Column映射,确认数据库字段名和方法名规则匹配:findAllByNameContaining生成的SQL是name like %?%,如果实际要匹配的字段是firstName之类的其他名称,会导致查询不到结果 Containing默认大小写敏感,如果数据库大小写规则不匹配,也会出现查询为空的情况,需要忽略大小写可以改成findAllByNameContainingIgnoreCase
- 检查
- 返回值封装逻辑漏洞
你当前代码把res.setSuccess(true)写在forEach遍历内部,如果查询结果为空,不会进入遍历逻辑,success字段会保留初始值(大概率是false),会误导你认为查询失败。应该把res.setSuccess(true)移到try块开头,只要没有抛出异常,查询动作本身就是成功的,有没有数据属于正常业务情况。 - SQL执行验证
在配置文件中添加spring.jpa.show-sql=true、spring.jpa.properties.hibernate.type.descriptor.sql.BasicBinder=TRACE,打印实际执行的SQL和绑定参数,把SQL复制到数据库客户端直接执行,确认是查询本身没有匹配数据,还是代码层处理的问题。 - 简单单元测试排除层级问题
直接注入DoctorPagingRepository做单元测试,固定传参PageRequest.of(0, 10)执行分页查询,排除Controller层参数解析、Service层调用的中间问题。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

