当前使用版本(必填,否则不予处理)
3.4.0
该问题是如何引起的?(确定最新版也有问题再提!!!)
最新版也有这个问题 数据库里有个表的字段是“next”,使用MysqlGenerator生成的JavaBean里面也就有个“next” 然后我们用了com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor,多租户拦截器 然后会报错
重现步骤(如果有就写完整)
1.数据库里有个Demo表的字段叫next 2.用MysqlGenerator生成Entity以及Service、Mapper 3.启用TenantLineInnerInterceptor
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1);
}
// 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
@Override
public boolean ignoreTable(String tableName) {
return !"user".equalsIgnoreCase(tableName);
}
}));
4.调用xxxService.list()
报错信息
“Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "next" "NEXT"”
经过定位原因,是因为MybatisPlusInterceptor.intercept方法内调用了CCJSqlParserUtil.parse(sql), CCJSqlParserUtil认为next是一个关键字,解析失败
给next 字段打上@TableField("`next`")注解,问题解决。
是否可以在生成SQL的时候,就给所有字段给加上`来
如: selectid,name` from table。
或者说,给个配置来打开这个功能
Comment From: nancheung
不建议用关键字,我们就算加上反引号,你们也会在别的地方踩坑
Comment From: wzdlagrange
好的,明白了