select * from t_notice_info tni order by create_time desc limit ? limit ?,?
项目里面同时使用了 PageHelper 和 mybatis plus 的 page 方法,但是在一次查询中只使用了 mybatis plus 的分页查询,结果出现了上面的问题,目前我知道主要是 PageInterceptor 拦截器错误识别对象导致的,但是我本地没办法复现问题,有哪位遇到过,可以解释一下吗
1
Vcccc 302 天前
如果是 springboot 项目,可以试试加一个 HandlerInterceptor ,然后再清空 PageHelper 的参数。原因大概是上一个查询报错了,然后当前线程保留了上一个分页参数,这里的做法就是,请求结束后,都做一次清空分页参数。
public class PageHelperInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { PageHelper.clearPage(); } } @Configuration public class WebConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new PageHelperInterceptor()).addPathPatterns("/**"); } } |
2
fantaxi 302 天前
是不是参数没清空导致的,每次查询完我都 PageHelper.clearPage() 一下
|
5
Laysan 302 天前
干掉 PageHelper
|
6
zzzmh 302 天前
不用 PageHelper ,就用 mybatisplus 自带的分页就行,可以自己写个工具类去辅助下,比如优化一下返回值。
|
7
SilentRhythm 302 天前
PageHelper 是 Thread 级别的拦截器,然后线程是复用的,实际上是线程泄露导致。
同一条线程只要调用了 PageHelper.startPage()没有紧跟.doSelectPageInfo()就会导致上述这种不明所以的拦截。 建议排查整个项目的 PageHelper.startPage(pageNum, pageSize)调用, 然后改成紧跟 lambda 的写法 PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() -> 实现) |
8
SilentRhythm 302 天前
|
9
SilentRhythm 302 天前
接上,建议参考源码:
com.github.pagehelper.page.PageMethod#startPage com.github.pagehelper.page.PageMethod#setLocalPage com.github.pagehelper.PageInterceptor#intercept com.github.pagehelper.PageHelper#afterAll |
11
RainCats 302 天前
没遇到过这个问题
|
12
crazykk 302 天前
是的,我记得 github 上有作者提到这种错误,要紧跟查询,同 7 楼的说法
|
13
janwarlen 302 天前
try (Page<T> p = PageHelper.startPage(pageNo, pageSize)) {
} |
14
curvatureship 302 天前
有可能是依赖版本的问题,PageHelper 和 MybatisPlus 分页共存遇到过类似的问题,查看错误日志排查后是因为 PageHelper 和 MybatisPlus 共同依赖的 jsqlparder 版本不一致导致的,调整版本后两者能共存没问题
|