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版本导致的问题

MyBatis-Plus执行SQL分析打印

mybatis-Plus 之 apply 拼接SQL

mybatis-plus调用自身的 selectById 方法报错:org.apache.ibatis.binding.BindingException:

Sql server的Merge语句,源表中如果有重复数据会导致执行报错

MySQL - 执行sql报错USING BTREE