Mybatis-Plus 3.4.x版本多租户关联SQL查询clause is ambiguous异常

Column 'tenant_id' in where clause is ambiguous异常问题处理

提示:如果时间不够请忽略我下边啰里啰嗦的背景及分析问题的过程,直接跳到解决问题这一步!!!

背景

        近期,公司组织安排代码漏洞扫描,暴露出许多问题,其中,最主要的便是springboot(2.1.10.RELEASE)以及springcloud(Greenwich.SR4)版本太低,导致许多相应组件存在许多漏洞。考虑到近期股份公司要进行网络攻防演练,公司领导决定升级程序版本,解决存在的许多已知漏洞,进而引出了此次问题。

        在版本升级的前提下,需要升级Mybatis-plus(3.2.0)到3.4.2版本,由于公司业务存在多租户的情况,自然而然的使用了Mybatis-plus的多租户插件。公司在前期需求分析时就引入了多租户的概念,所以在数据库表结构设计时,就预留了此字段,但是,在后期的代码编写阶段,许多开发人员并没有严格按照开发文档执行,有许多插入SQL中手动拼接了租户ID(tenant_id)字段,导致后期启用多租户插件后发现在插入语句中tenant_id字段重复。

        所以,想要删除代码中手动拼接的租户ID字段不仅费时费力,而且不一定能够全部的筛选处理,所以,为了解决插入SQL语句中重复的租户ID字段问题,我们继承了TenantSqlParser类,将TenantSqlParser的processInsert方法重写,通过解析Insert类下的columns字段,判断是否已经包含租户ID字段,如果已经存在了,那么就不会通过多租户插件进行自动拼接了。实现方法下面会提到。

        同时,在查询语句中,因为mybatis-plus自带的功能只会拼接left 、from和where后面的表或子查询添加租户id,但是,当Select中存在子查询时,并没有自动拼接租户ID,所以,为了实现子查询自动拼接租户ID,我们也将TenantSqlParser的processPlainSelect方法进行重写,处理Select部分的嵌套查询拼接租户id问题。

import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
import net.sf.jsqlparser.expression.CaseExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.WhenClause;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.select.SubSelect;

import java.util.List;

/***
* 多租户sql解析器扩展
* @description: 多租户sql解析器扩展
* @author: nilong
* @date: 2022/5/16 11:10
* @return:
*/
public class TenantSqlParserExt extends TenantSqlPar
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值