MybatisPlusException: Failed to process报错解决和SaaS系统类型的数据库租户sql过滤实现

目录

报错原因

解决方案

方案一:运行空间换sql

方案二 :添加对sql放行的注解

1)非租户

2)租户

2.1)使用mybatis-plus 自带的

2.2)使用自定义租户


报错原因

        出现报错原因一般为使用了自定义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博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个爱玩的社畜开发程序媛

三瓜两枣聚集处

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值