[特殊字符] 【踩坑记录】没调 startPage(),SQL 却被自动分页了?

🚀 【踩坑记录】没调 startPage(),SQL 却被自动分页了?

1. 现象

Controller 中没写 PageHelper.startPage(),但执行 SQL 时末尾自动出现了 LIMIT,导致查询结果数量不对。

2. 核心原因:ThreadLocal 污染

PageHelper 的分页参数存放在 ThreadLocal 中。

  • 脏数据来源 :如果前一个请求调用了 startPage()没有执行查询 (由于异常或 if 逻辑提前返回),分页参数会残留在线程中。
  • 线程池复用:Tomcat 线程池会复用线程。下一个请求(即你的接口)碰巧使用了这个"脏线程",PageHelper 拦截器就会自动读取残余参数并触发分页。
3. 诱因:参数自动匹配 (supportMethodsArguments)

检查配置文件:pagehelper.supportMethodsArguments: true

如果开启此项,PageHelper 会自动反射扫描你的请求对象。只要你的公共类里有 pageNumpageSize 字段且不为空,它就会自动开启分页,无需手动调用。

4. 解决方案
  • 规范化 :确保 startPage() 后紧跟查询,或在 finally 块执行 PageHelper.clearPage()

  • 改配置 :建议将 support-methods-arguments 设为 false,由代码显式控制分页,减少"黑盒"行为。

    yml 复制代码
    pagehelper:
      support-methods-arguments: false
  • 强力清空 :在不需要分页的接口开头手动调用 PageHelper.clearPage() 以防万一。

相关推荐
I'm Jie1 小时前
【已解决】SqlAlchemy 插入 MySQL JSON 字段时 None 变为 ‘null‘ 字符串,WHERE IS NULL 失效
数据库·python·mysql·json·fastapi·sqlalchemy
之歆1 小时前
MySQL 数据库理论、安装、查询、事务与备份恢复
数据库·mysql·adb
SQL必知必会1 小时前
SQL 描述性统计:超越平均值和计数
数据库·sql
ActionTech2 小时前
数据集推荐 06 | 首款 NL2GeoSQL 的测试基准和数据集来了!
数据库·人工智能·sql
码云数智-大飞2 小时前
跳出索引思维定式:一次基于业务逻辑的非典型 SQL 优化实践
数据库·sql
PD我是你的真爱粉2 小时前
Redis基础与数据结构
数据结构·数据库·redis
山岚的运维笔记2 小时前
SQL Server笔记 -- 第46章 窗口函数
数据库·笔记·sql·microsoft·sqlserver
科技块儿2 小时前
【工具对比】免费IP库用于广告投放是否可靠?误差率实测报告
网络·数据库·tcp/ip
晔子yy2 小时前
带你了解Java中的Mono接口
java·数据库·oracle