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干货盘点#