Mybatis在多次查询后如何返回Page对象,且SQL语句中额外添加limit限制?

2026-04-28 12:142阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计472个文字,预计阅读时间需要2分钟。

Mybatis在多次查询后如何返回Page对象,且SQL语句中额外添加limit限制?

今天在前端走页面的时候,发现一个接口返回的数据出现了意外结果。先看看我需要返回的数据:![数据截图](http://img.558idc.com/uploadfile/allimg/boke/2487210-20220615114111249-1114701040.png) 再看一次。

今天在前端走页面的时候,发现有个接口返回的数据偶尔出现一次不是预想的结果。

先看我需要返回的数据:

![](img.558idc.com/uploadfile/allimg/boke/2487210-20220615114111249-1114701040.png)

再看不是预想中的数据:

![](img.558idc.com/uploadfile/allimg/boke/2487210-20220615114221094-1683289310.png)

断点调试后发现问题出现在List<Product> products = productBiz.selectListAll();这个方法上,
正常情况下返回的是全部,偶尔一次返回一个page对象。
products = Page{count=true, pageNum=1, pageSize=3, startRow=0, endRow=3, total=12, pages=4, reasonable=false, pageSizeZero=false}


一开始我以为是二级缓存的原因,于是手动写了一个sql查询语句,将flushCache设置为true。

<select id="selectProducts" resultMap="productMap" flushCache="true"> select * from product; </select>

这时候多调这个接口的时候,会出现报错的情况,大概意思是在select * from product;LIMIT 3 附近有sql语法错误,但是我原本的sql语句是没有limit的,为什么会突然给我追加一个limit呢。所以这时候我把思绪转向了分页这里。
后面查了资料,发现原因:PageHelper插件是通过ThreadLocal实现分页的,page参数和线程是绑定在一起的,如果在前面其他的接口中page没消费,就会保留在这个线程上,会导致不该分页的方法消费了这个分页参数。

解决办法
List<Product> products = productBiz.selectListAll();方法前面加上PageHelper.clearPage();清楚分页参数缓存。


更多方法可参考mybatis执行自定义sql时,多出一个limit

Mybatis在多次查询后如何返回Page对象,且SQL语句中额外添加limit限制?

本文共计472个文字,预计阅读时间需要2分钟。

Mybatis在多次查询后如何返回Page对象,且SQL语句中额外添加limit限制?

今天在前端走页面的时候,发现一个接口返回的数据出现了意外结果。先看看我需要返回的数据:![数据截图](http://img.558idc.com/uploadfile/allimg/boke/2487210-20220615114111249-1114701040.png) 再看一次。

今天在前端走页面的时候,发现有个接口返回的数据偶尔出现一次不是预想的结果。

先看我需要返回的数据:

![](img.558idc.com/uploadfile/allimg/boke/2487210-20220615114111249-1114701040.png)

再看不是预想中的数据:

![](img.558idc.com/uploadfile/allimg/boke/2487210-20220615114221094-1683289310.png)

断点调试后发现问题出现在List<Product> products = productBiz.selectListAll();这个方法上,
正常情况下返回的是全部,偶尔一次返回一个page对象。
products = Page{count=true, pageNum=1, pageSize=3, startRow=0, endRow=3, total=12, pages=4, reasonable=false, pageSizeZero=false}


一开始我以为是二级缓存的原因,于是手动写了一个sql查询语句,将flushCache设置为true。

<select id="selectProducts" resultMap="productMap" flushCache="true"> select * from product; </select>

这时候多调这个接口的时候,会出现报错的情况,大概意思是在select * from product;LIMIT 3 附近有sql语法错误,但是我原本的sql语句是没有limit的,为什么会突然给我追加一个limit呢。所以这时候我把思绪转向了分页这里。
后面查了资料,发现原因:PageHelper插件是通过ThreadLocal实现分页的,page参数和线程是绑定在一起的,如果在前面其他的接口中page没消费,就会保留在这个线程上,会导致不该分页的方法消费了这个分页参数。

解决办法
List<Product> products = productBiz.selectListAll();方法前面加上PageHelper.clearPage();清楚分页参数缓存。


更多方法可参考mybatis执行自定义sql时,多出一个limit

Mybatis在多次查询后如何返回Page对象,且SQL语句中额外添加limit限制?