使用Union All导致 PageHelper 插件分页失效问题

#踩雷问题记录 #MyBatis #分页查询 #Java

问题描述

在使用 MyBatis 搭配 PageHelper 分页插件时,接口请求 GET /aigc/app/query-apps?categoryId=1907635448432992257&pageNum=1&pageSize=6 本应返回6条记录,但实际返回了8条记录,pageSize 字段也变成了8。也就是说,分页功能未生效,多返回了数据。

经仔细检查,是因为mapper.xml中使用了比较复杂的联合查询逻辑,导致PageHelper插件失效。

原因分析

❗PageHelper 没有真正拦截分页 SQL

这类问题在使用 PageHelper + UNION ALL 的 SQL 时非常典型
PageHelper 会在 MyBatis 执行语句前拦截构造 SQL,自动添加 LIMIT。但如果你的 XML 中包含某些结构(如 UNION ALL、动态 SQL、复杂嵌套子查询),PageHelper 可能会提前查询完整数据(不分页),然后再进行内存分页(即 Java 代码中分页,而不是数据库分页)。

解决方式

询问了Gpt,尝试使用了”使用子查询包裹 UNION ALL,让 PageHelper 正确识别分页点“方式,未能成功解决。

最后采用的方式是手写分页查询,赋值给PageInfo。以下是文件的一些改动:

  1. mapper.xml : 在select结尾加上LIMIT和OFFSET
	LIMIT #{pageSize} OFFSET #{offset}
  1. xxxServiceImpl.java : 计算offset, total, 总页数,是否有上一页,是否有下一页等PageInfo信息
// PageHelper.startPage(pageNum, pageSize);   之前的PageHelper已经失效 
int offset = (pageNum - 1) * pageSize;  
  
List<AigcAppWithCategoryDTO> list = aigcAppMapper.selectAppsWithCategoryByCategoryId(categoryId,offset, pageSize);
PageInfo<AigcAppWithCategoryDTO> pageInfo = new PageInfo<>();  
pageInfo.setList(list);  
pageInfo.setPageNum(pageNum);  
pageInfo.setPageSize(pageSize);  
pageInfo.setTotal(total);  
pageInfo.setPages((total + pageSize - 1) / pageSize); // 计算总页数  
pageInfo.setHasPreviousPage(pageNum > 1); // 是否有上一页  
pageInfo.setHasNextPage(pageNum < pageInfo.getPages()); // 是否有下一页  
  
return pageInfo;
	
错误代码40007表示不合法的媒体文件id,错误信息为"invalid media_id"。微信原始报文为{"errcode":40007,"errmsg":"invalid media_id hint: [EOhqJA0302d443] rid: 64eedb46-365b2be6-6b96ea3e"}。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [微信上传图文消息素材40007,invalid media_id hint](https://blog.csdn.net/w995223851/article/details/88349919)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ 错误信息:code 无效,微信原始报文:{“errcode“:40029,“errmsg“:“invalid code, hints: [ req_id:...](https://blog.csdn.net/qq_43672652/article/details/112472080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [关于微信小程序的支付开发:40013错误](https://download.csdn.net/download/weixin_38590790/16213652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值