当前使用版本 mybatis-plus-extension:3.5.6
当前环境信息 例如: Java17 + Mysql5.7
描述bug现象 分页插件中处理 LIMIT 语句时,当传递的 Page 对象中的 size 为-1 且没有配置 maxLimit 时,由于判断逻辑错误,没有跳过 LIMIT 拼接,反而最终会拼接为 LIMIT -1;
流程分析:当没有提前结束 LIMIT 的拼接,继续执行后面逻辑,当 size 为 -1 时 offset 函数的计算逻辑会使得每次都返回 0。那么最终数据为:offset -> 0,size -> -1,最终就拼接为了 LIMIT -1,最后执行 SQL 语句数据库报错。 default long offset() { long current = getCurrent(); if (current <= 1L) { return 0L; } return Math.max((current - 1) * getSize(), 0L); }
提供问题复现步骤
** 修复建议 ** 由于对 _limit 进行了判断初始化,永远不为 null,建议判断更为:page.getSize() < 0 && _limit < 0
Comment From: miemieYaho
page.maxLimit和插件.maxLimit和page.size分别为什么值会出现你说的情况?
Comment From: congqingquan
page.maxLimit和插件.maxLimit和page.size分别为什么值会出现你说的情况?
page.maxLimit == null page.size == -1 插件.maxLimit == -1
Comment From: congqingquan
page.maxLimit和插件.maxLimit和page.size分别为什么值会出现你说的情况?
Comment From: congqingquan
page.maxLimit和插件.maxLimit和page.size分别为什么值会出现你说的情况?
抱歉,并不是一个问题,将 maxLimit 配置为 null 就好了。老版本配置的 -1。