当前使用版本(必填,否则不予处理)

当前办文 3.3.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

不清楚

重现步骤(如果有就写完整)

TenantHandler 我现在是多租户情况下,因为要可能会存在一个人查多个租户数据 因此 需要在 select的时候 植入 tenantid in (1,2,3) 插入和修改的时候 是 tenantid =1 ,其中 1,2 的逻辑,属于我业务代码,自行处理; 目前现状是 select 的时候 tenantid in (1,2,3) 没问题, 插入的时候 也变成了 tenantid in (1,2,3); 不清楚public Expression getTenantId(boolean where) 中的where 是干什么用的,源码中 我看 不管是什么情况下 都是传的false

报错信息

Comment From: totoro52

涉及到多个租户操作的方法可以屏蔽掉插件的拦截。

Comment From: AaronHxm

目前已经解决,解决思路如下 1、TenantHandler接口的getTenantId处,根据自己的业务去判断走tenantid = 还是tenantid in 表达式 public Expression getTenantId(boolean where) { List tenantId = TenantContextHolder.getTenantId(); final boolean multipleTenantIds = false;//这里只是演示切换单个tenantId和多个tenantId //具体场景,可以根据情况来拼接 //todo 需要解决 selecttenantid in (1,2) 但是 insert 是 tenantid =1 if ( multipleTenantIds) { //演示如何实现tenant_id in (1,2) return multipleTenantIdCondition(); } else { //演示:tenant_id=1 return singleTenantIdCondition(); } }

//以下为 tenantid in 表达式 private Expression multipleTenantIdCondition() { final InExpression inExpression = new InExpression(); inExpression.setLeftExpression(new Column(getTenantIdColumn())); final ExpressionList itemsList = new ExpressionList(); final List inValues = new ArrayList<>(2); inValues.add(new StringValue("1278680935482384386"));//ID自己想办法获取到 inValues.add(new StringValue("1278680935482384387")); itemsList.setExpressions(inValues); inExpression.setRightItemsList(itemsList); return inExpression; }

2、看源码TenantSqlParser,发现源码中调用tenantHandler.getTenantId()此方法,传入的boolean 都是false,然后我的场景是 select 需要in insert 需要 = 3、继承TenantSqlParser类,builderExpression此方法,在调用 tenantHandler.getTenantId() 传入true 4、在第一步getTenantId,加入判断 如果where =true 则表示是select,则进行tenantid in 表达式,如果是false,则表示insert 直接进行 tenantid = 表达式

Comment From: Surrin1999

目前已经解决,解决思路如下 1、TenantHandler接口的getTenantId处,根据自己的业务去判断走tenantid = 还是tenantid in 表达式 public Expression getTenantId(boolean where) { List tenantId = TenantContextHolder.getTenantId(); final boolean multipleTenantIds = false;//这里只是演示切换单个tenantId和多个tenantId //具体场景,可以根据情况来拼接 //todo 需要解决 selecttenantid in (1,2) 但是 insert 是 tenantid =1 if ( multipleTenantIds) { //演示如何实现tenant_id in (1,2) return multipleTenantIdCondition(); } else { //演示:tenant_id=1 return singleTenantIdCondition(); } }

//以下为 tenantid in 表达式 private Expression multipleTenantIdCondition() { final InExpression inExpression = new InExpression(); inExpression.setLeftExpression(new Column(getTenantIdColumn())); final ExpressionList itemsList = new ExpressionList(); final List inValues = new ArrayList<>(2); inValues.add(new StringValue("1278680935482384386"));//ID自己想办法获取到 inValues.add(new StringValue("1278680935482384387")); itemsList.setExpressions(inValues); inExpression.setRightItemsList(itemsList); return inExpression; }

2、看源码TenantSqlParser,发现源码中调用tenantHandler.getTenantId()此方法,传入的boolean 都是false,然后我的场景是 select 需要in insert 需要 = 3、继承TenantSqlParser类,builderExpression此方法,在调用 tenantHandler.getTenantId() 传入true 4、在第一步getTenantId,加入判断 如果where =true 则表示是select,则进行tenantid in 表达式,如果是false,则表示insert 直接进行 tenantid = 表达式

为什么这么麻烦。。在方法上加个注解屏蔽掉多租户插件不就行了吗

Comment From: totoro52

你这有点曲线救国了,其实可以用注解就能解决,就是需要手写SQL

Comment From: AaronHxm

手写sql 肯定是不现实的 你可以理解为 我是部门领导 我查询的时候 我要看我以及我下面属下的数据,插入的数据 只能我自己看

Comment From: AaronHxm

你这有点曲线救国了,其实可以用注解就能解决,就是需要手写SQL

手写sql 肯定是不现实的 你可以理解为 我是部门领导 我查询的时候 我要看我以及我下面属下的数据,插入的数据 只能我自己看

Comment From: AaronHxm

你这有点曲线救国了,其实可以用注解就能解决,就是需要手写SQL

烦请指导指导 业务场景 大概如此 我是部门领导 我查询的时候 我要看我以及我下面属下的数据,插入的数据 只能我自己看

Comment From: totoro52

你这有点曲线救国了,其实可以用注解就能解决,就是需要手写SQL

烦请指导指导 业务场景 大概如此 我是部门领导 我查询的时候 我要看我以及我下面属下的数据,插入的数据 只能我自己看

你这个跟多租户没关系吧 这个业务场景 我做过这个需求 我用的是权限拦截器 复写DataPermissionInterceptor这个拦截器,根据用户的身份吧标签注入不同的where条件

Comment From: totoro52

你这有点曲线救国了,其实可以用注解就能解决,就是需要手写SQL

烦请指导指导 业务场景 大概如此 我是部门领导 我查询的时候 我要看我以及我下面属下的数据,插入的数据 只能我自己看

建议你查阅下Plus的文档,有一个数据权限控制拦截器,通过复写他就可以实现你的需求了

Comment From: qmdx

严格来说你的需求不属于租户范畴,为权限问题,不过你的处理方法也算是可行