场景:我的查询参数包含了 orderBy, 并且 sql 里面也包含了 orderBy, 我并没有用参数里面的 orderBy. 同时也没启用分页,但 PageHelper 把 SQL 重写错了。过程如下:
- com.github.pagehelper.PageInterceptor#intercept, 缺少是否 PageHelper.startPage() 的判断,导致后续多跑了很多逻辑
- com.github.pagehelper.util.PageObjectUtil#getPageFromObject, getParamValue过程,从参数里面获取了多项参数 (当前我是追踪了 orderBy)
- com.github.pagehelper.dialect.AbstractHelperDialect#getPageSql, 从 Param 里面来的 orderBy, 被成功识别并进一步处理
- com.github.pagehelper.parser.defaults.DefaultOrderBySqlParser#converToOrderBySql, SQL 中的 orderBy 被用语法树移除了,并且 orderBy 被重新加在了最后 (在 limit 之后)
- 得到 SQL:
LIMIT 0, 10 order by sort, 语法错误
可考虑以下优化/修复方案:
- com.github.pagehelper.PageInterceptor#intercept, 先判断用户是否 startPage, 如果没有,直接放行到下一个拦截器就好,能避免后续的各种问题
- com.github.pagehelper.util.PageObjectUtil#getPageFromObject, 过程,不应该依赖用户的业务对象入参,只能依赖分页组件的自身入参,否则参数容易被污染
- com.github.pagehelper.parser.defaults.DefaultOrderBySqlParser#converToOrderBySql 需要考虑较多情况。移除 order by 用了语法树,那拼接回 order by 也应该用语法树
以上几个方案,应该都能避免这次悲剧的发生。熬夜找问题头发都没了
当然,翻看 issues, 好几个人提到了 orderBy 问题,没得到合理的解决, 希望大佬能解决此问题
场景:我的查询参数包含了 orderBy, 并且 sql 里面也包含了 orderBy, 我并没有用参数里面的 orderBy. 同时也没启用分页,但 PageHelper 把 SQL 重写错了。过程如下:
LIMIT 0, 10 order by sort, 语法错误可考虑以下优化/修复方案:
以上几个方案,应该都能避免这次悲剧的发生。熬夜找问题头发都没了
当然,翻看 issues, 好几个人提到了 orderBy 问题,没得到合理的解决, 希望大佬能解决此问题