mybatis-plus使用函数导致执行sql报错问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-plus使用函数导致执行sql报错问题相关的知识,希望对你有一定的参考价值。
参考技术A 错误提示信息可以看到是因为 TenantLineInnerInterceptor 导致的错误
增加注解:
mybatis-plus中使用MySQL函数
最近在做的项目有个相册功能,需要按年份分类筛选。这不禁让人想到mysql中的year(date)
函数(其实我也没想到,度娘告诉我的)。
year(date)函数是将date中的年份提出来。比如year(‘2022-10-02 12:21:23’) = 2022。那么我们就可以在sql语句中使用这来做判断。例如:
select *
from t_picture
where album_id = 1 and year(create_time) = "2021"
ORDER BY create_time DESC
一开始我想到的是,使用Mybatis-plus(后面简称MP) 中的last()
来拼接在最后,无视优化规则直接拼接到 sql 的最后,然后再拼上排序就可以。运行才知道,last()
只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用,也就是说会把之前的覆盖掉。后来我又去翻MP的手册 Mybatis-Plus官网
发现有一个函数我之前没接触过。apply()
拼接 sql
注意事项:
该方法可用于数据库函数 动态入参的params对应前面applySql内部的index部分.这样是不会有sql注入风险的,反之会有!
public PageUtils queryPage(Map<String, Object> param)
Integer albumId = Convert.toInt(param.get("albumId"));
Integer type = Convert.toInt(param.get("type"));
Integer year = Convert.toInt(param.get("year"));
IPage<Picture> page = this.page(new Query<Picture>().getPage(param),
new QueryWrapper<Picture>()
.eq(type!=null,"type",type)
.eq(albumId!=null,"album_id",albumId)
.apply(year!=null,"year(create_time) = 0",year)
.orderByDesc("create_time"));
return new PageUtils(page);
注意:0
不要加引号,系统会自动帮你加。加了会随便不到占位,会出现以下错误:
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql :
SELECT COUNT(1) FROM t_picture WHERE (type = ? AND year(create_time) = '?')
...........
Parameter index out of range (2 > number of parameters, which is 1).
错误解释,只有一个占位,却来两个参数,导致不能运行。这是因为0
加上引号的原因,MP识别不到占位符。就少一个坑,多出来了个萝卜。
apply()
还可用于其他函数,更多用法可自行琢磨
以上是关于mybatis-plus使用函数导致执行sql报错问题的主要内容,如果未能解决你的问题,请参考以下文章
mybatis-plus调用自身的 selectById 方法报错:org.apache.ibatis.binding.BindingException: