目录
报错原因
出现报错原因一般为使用了自定义SQL,可能含有特殊的函数或者复杂的语法,或者说租户相关影响的报错。
解决方案
方案一:运行空间换sql
常见的基础报错可能是在sql中,条件语句关键字in 后面的传参列表过大。像这种SQL语句,我们可以通过使用运行空间去替换复杂的SQL。例如,我们可以通过大范围sql 简单语句,再通过,java8新特性stream的取出我们想要的数据。
//码表 ,字典关键字和字典code确定为字典的唯一标识,下级字典将上级字典的唯一标识作为字典关键字
Map<String, List<DictBiz>> listBiz = dictBizService.list(new QueryWrapper<DictBiz>().lambda()
.eq(DictBiz::getIsDeleted, 0)
.ne(DictBiz::getSort, 99999)
.notIn(DictBiz::getDictValue, DictCodeSame.SUGER.getDictValue()))
.stream().collect(Collectors.groupingBy(DictBiz::getDictValue));
//取出字典值和字典值下级的所有集合,包含本级
Map<String, Map<String, DictBiz>> listBizMap = new HashMap<>();
//取出字典值和字典值本级相关数据
Map<String, DictBiz> keyCodeMap = new HashMap<>();
listBiz.forEach((s, dictBizs) -> {
Map<String, DictBiz> collect = new HashMap<>();
Map<String, DictBiz> dictBizMap = new HashMap<>();
for (DictBiz dictBiz : dictBizs) {
//顶级字典关键字为-1
String key = StringUtil.equals(dictBiz.getDictKey(), "-1") ? dictBiz.getCode() : dictBiz.getCode() + dictBiz.getDictKey();
if (!dictBizMap.containsKey(key)) {
dictBizMap.put(key, dictBiz);
}
collect.put(dictBiz.getCode(), dictBiz);
}
listBizMap.put(s, collect);
keyCodeMap.putAll(dictBizMap);
});
方案二 :添加对sql放行的注解
这里需要补充一个租户的知识
简单通俗的来说,就是同一套代码,同一个部署,同一个数据库,同一张表,通过字段的取值来隔离不同租户,常用的数据库字段名为(tenant_id),多用于SaaS系统。个人理解,和登录用户的区别,可以用分组来解释。一般运用于商业,就是系统可以创建tenant_id标识A给A租户给A企业/机构,创建tenant_id标识B给B租户给B企业/机构。
1)非租户
原文参考网址:解决MyBatisPlus报错:Failed to process, please exclude the tableName or statementId-CSDN博客
但是这篇文章中所说得@SqlParser 已经淘汰,从官网可见版本升级3.4.0 +目前使用的是
@InterceptorIgnore(tenantLine = "true")
官网参考网址:插件主体 | MyBatis-Plus (baomidou.com)
2)租户
2.1)使用mybatis-plus 自带的
当我们系统类型为多租户的情况,则我们需要通过
@InterceptorIgnore(tenantLine = "1") // 忽略多租户拦截器
官网参考网址:注解配置 | MyBatis-Plus (baomidou.com)
2.2)使用自定义租户
当使用MybatisPlus的多租户插件时发现一些不方便的地方,因启用多租户时,租户之间是完全隔离的,现在需要一位管理员权限的用户在特定菜单功能下不能有租户隔离。目前还未涉及过,原文参考网址:MyBatis-Plus忽略多租户隔离自定义注解_mybatisplus 忽略租户-CSDN博客