Quarkus后端Panache分页结果异常:返回数据数量不符求助
问题分析与解决方案
核心问题
你遇到的分页数据不符问题,根源是Quarkus Panache的Page采用0起始页码(从0开始计数),而你传入的pageIndex=1实际指向第二页,导致数据匹配异常:
- 当
pageIndex=1、pageSize=6时,第二页没有数据(总数据仅6条,第一页已全部返回) - 当
pageIndex=1、pageSize=4时,第二页刚好是剩余的2条数据,所以返回2条
同时你的代码还存在语法和参数传递的错误,具体修正如下:
后端代码修正
原代码存在@Path注解用法错误、分页方法调用错误、参数未正确绑定的问题,修正后代码如下:
方案1:使用路径参数接收页码和每页数量
@GET @Path("/getPage/{pageIndex}/{itemsPerPage}") public Response getAll(@PathParam("pageIndex") int pageIndex, @PathParam("itemsPerPage") int itemsPerPage) { // 将1起始的页码转为Panache需要的0起始页码 int adjustedPage = pageIndex - 1; // 正确调用Panache分页方法 List<PatientsTbl> patients = productsRepository.findAll() .page(Page.of(adjustedPage, itemsPerPage)) .list(); return Response.ok(patients).build(); }
方案2:使用查询参数接收(匹配你的前端调用方式)
如果不想修改前端的queryParam调用方式,后端改用@QueryParam接收参数:
@GET @Path("getPag") public Response getAll(@QueryParam("pageNum") int pageNum, @QueryParam("pageSize") int pageSize) { int adjustedPage = pageNum - 1; List<PatientsTbl> patients = productsRepository.findAll() .page(Page.of(adjustedPage, pageSize)) .list(); return Response.ok(patients).build(); }
前端调用注意事项
如果使用方案1的路径参数方式,前端调用需要改为路径变量传递参数:
public List<PatientsTbl> getListWithPagination(int pageNum, int pageSize) throws Exception{ String data = target.path("/patients/getPage/" + pageNum + "/" + pageSize) .request(MediaType.APPLICATION_JSON) .get(String.class); ObjectMapper mapper = new ObjectMapper(); System.out.println(data); return mapper.readValue(data, new TypeReference<List<PatientsTbl>>(){}); }
如果使用方案2,你的原前端代码无需修改,只需确保参数名pageNum和pageSize与后端的@QueryParam参数名一致即可。
关键说明
- Panache的
Page.of(pageIndex, pageSize)中,pageIndex必须是0起始的数值,这是JPA分页的通用规范,和很多框架的1起始页码逻辑不同 - 原代码中
.page(Page.of(...), pageRequest.getPageSize())属于错误调用,page方法仅需传入一个Page对象即可,多余的第二个参数会导致逻辑异常 - 原后端方法的参数上使用
@Path注解是错误的,路径参数需要用@PathParam绑定,查询参数用@QueryParam绑定
内容的提问来源于stack exchange,提问作者Hala
相关产品推荐
相关产品推荐

