他讲的这个和目前官网版本差距有点大,反正我是结合讲的和看的官网文档以及官网提供的案例,理解起来感觉还可以。
可以参考:https://juejin.cn/post/6920102056149647374
我理解你想说的是拦截器吧 原理是一样的
看MP3.4.1版本对TenantLineHandler接口的注释,“获取租户 ID 值表达式,只支持单个 ID 值”。如果以官方的注释来判断,是不支持in的。
TenantSchemaHandler这个我也没用过,不知道你那是什么原因不生效,我只是使用过TenantHandler。你可以加入他们的官方群,询问一下作者,或者在github/gitee上提问。
如果你的TenantId为null的话,不会进行过滤。你登录后,获取到company_id可以存储到session中或者其他该用户能获取到其他用户不能获取的地方。然后在多租户的getTenantId方法中取出来包装成Expression对象返回即可。这样就实现了登录查询是不过滤,其他方法过滤。
你这个代码我下载下来了,我这调试起来,稍微有点费劲。我给你个思路,你看看行不行,如果不行我再帮你调试一下。
就是你不要把PaginationInterceptor注入到拦截器中,你可以像我那个例子一样,在一个地方定义一个ThreadLocal静态变量保存你的tennatid字段。在你的TenantInterceptor拦截器中将区分租户的值设置到静态变量上,然后再PaginationInterceptor中的多租户解析器中把他取出来。例如:
public Expression getTenantId(boolean where) { Long tenantId = local.get(); if(tenantId != null) { return new LongValue(tenantId ); } return null; }
用完了之后,记得把ThreadLocal清空,防止线程归还到线程池后,被其他线程复用。
还有一个办法你可以把tennatid在拦截器中存储到request中,然后再PaginationInterceptor取出来。
试试看看是否可行,如果不可行,再反馈给我。
同学,不要搞混概念啊,我的课程只是一个例子,用manager_id列作为TenantId(区分不同租户的字段)了,TenantId应该是你动态获取设置的。有的TenantId可能是当前登录人的机构id或者其他的字段。一般是没有拿当前登录人的id作为TenantId,建议你看看多租户的信息,据我了解目前MP只支持单字段的TenantId。
如果你可以考虑关闭mapper层二级缓存,将缓存放到service层的话。那么修改后再试试,看是否依然还存在问题,如果还有问题,可以再反馈给我。