MybatisPlus使用QueryWrapper调用queryWrapper.last(“limit 1“)时,多次请求该接口后,结尾多出一个“LIMIT 5”

Posted 做软件开发的小锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MybatisPlus使用QueryWrapper调用queryWrapper.last(“limit 1“)时,多次请求该接口后,结尾多出一个“LIMIT 5”相关的知识,希望对你有一定的参考价值。

项目场景:

在使用mybatisPlus自定义查询时,调用queryWrapper.last("limit 1"),想取出查询结果的第一条


问题描述:

使用该接口做数据查询,在初次请求结果正常,请求该接口五次左右,会出现sql报错,提示SQL语句错误,查看控制台日志:

limit 1 LIMIT 5 FAILED after 69 ms java.sql.SQLSyntaxErrorException:

发现在sql语句尾部多加了一条“limit 5”,具体组合为:

select * from sys_archive where 1=1 and limit 1 LIMIT 5

原因分析:

        开始通过断点的方式,通过页面请求,不断对该接口进行调试,发现总是在第五次请求后,结尾莫名加上“LIMIT 5”,无法看出原因;

        修改代码,调用selectList方法,返回list.get(0),报错消失,但没有从根源上解决问题,多次请求后sql尾部还是会加上LIMIT 5”,由于去掉了queryWrapper.last("limit 1"),所以组合的sql语句不会报错了,程序能正常执行(治标不治本);

        考虑可能是前端页面存在,使用postman和swagger进行接口测试,发现报错消失,仔细看前端的请求,发现在改按钮上还绑定了其他请求,另一个请求为分页查询,在代码中多写了一行:

PageHelper.startPage(pageNum , pageSize);

且第二次调用并未紧跟mybatis的查询方法,导致出现安全问题,在执行

PageHelper.startPage(pageNum , pageSize);

方法后,参数page变量,如xx!=null,直接返回xx,则page没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,如果接下来执行其它sql,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。而和他同时请求的另一接口,和他处在同一线程,从而产生分页,而且该查询调用了

queryWrapper.last("limit 1");

组合之后则产生报错;


解决方案:

        删除多余的 PageHelper.startPage(pageNum , pageSize);分页方法即可

以上是关于MybatisPlus使用QueryWrapper调用queryWrapper.last(“limit 1“)时,多次请求该接口后,结尾多出一个“LIMIT 5”的主要内容,如果未能解决你的问题,请参考以下文章

MybatisPlus:中QueryWrapper<>().lambda使用(条件查询)

MybatisPlus使用QueryWrapper调用queryWrapper.last(“limit 1“)时,多次请求该接口后,结尾多出一个“LIMIT 5”

mybatisplus自定义sql+QueryWrapper

利用反射生成 MyBatisPlus中QueryWrapper动态条件 #yyds干货盘点#

MybatisPlus QueryWrapper and or 连用

MybatisPlus QueryWrapper and or 连用