mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

BaseMultiTableInnerInterceptor【数据权限】 处理left join时,遇到join的表只会拼接到 on条件并不会拼接到where条件后 #5797

Open HillCheuang opened this issue 2 years ago • 8 comments
trafficstars

该Pull Request关联的Issue

https://github.com/baomidou/mybatis-plus/issues/5797

修改描述

BaseMultiTableInnerInterceptor【数据权限】 处理left join时,遇到join的表只会拼接到 on条件并不会拼接到where条件后 #5797

测试用例

   sqlSegmentMap.put(TEST_6, "sys_user", "u.state=1 and u.amount > 1000");
        sqlSegmentMap.put(TEST_6, "sys_user_role", "r.role_id=3 AND r.role_id IN (7,9,11)");

  assertSql(TEST_6, "select u.username from sys_user u LEFT join sys_user_role r on u.id=r.user_id",
            "SELECT u.username FROM sys_user u LEFT JOIN sys_user_role r ON u.id = r.user_id AND r.role_id = 3 AND r.role_id IN (7, 9, 11) WHERE u.state = 1 AND u.amount > 1000 AND r.role_id = 3 AND r.role_id IN (7, 9, 11)");

详细请看MultiDataPermissionInterceptorTest#test6

修复效果的截屏

HillCheuang avatar Nov 22 '23 10:11 HillCheuang

left join on... and 后面有是一样的效果,你为什么需要 where 后面再加一次?

qmdx avatar Nov 25 '23 09:11 qmdx

left join on... and 后面有是一样的效果,你为什么需要 where 后面再加一次?

不一样啊,我举一个例子,目前数据权限的设计会导致左表有数据,右表的数据全是NULL 假设我们有两个表,一个是学生表(Students),另一个是成绩表(Scores),它们之间有一个共同的字段student_id(学生ID)。我们希望获取所有学生及其对应的成绩信息。

首先,我们可以使用LEFT JOIN来查询这些数据:

SELECT students.student_id, students.name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id;

以下是结果集合

student_id name score
1 Tom 85
2 Jane 92
3 John 80
4 Sarah 78

若数据权限只拼接上on 条件上,不拼接where条件上, 会出现部分score列全为null,下面是sql

SELECT students.student_id, students.name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id and score >80

以下是结果集合

student_id name score
1 Tom 85
2 Jane 92
3 John NULL
4 Sarah NULL

若on条件拼接上,where条件拼接上,结果集就是如下

SELECT students.student_id, students.name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id and score >80
where score>80

以下是结果集合

student_id name score
1 Tom 85
2 Jane 92

HillCheuang avatar Nov 27 '23 03:11 HillCheuang

left join on... and 后面有是一样的效果,你为什么需要 where 后面再加一次?

根据上面的回答,在某些实际业务中,需要有数据权限的表是用于在 left join 语句上... 进行聚合数据...,若 你没有数据权限查看此数据,我的理解是总体过滤好一点 。

HillCheuang avatar Nov 27 '23 03:11 HillCheuang

https://github.com/baomidou/mybatis-plus/issues/5186 可以看另外一个issue 有点类似于这个问题,不过这个是 只拼接了on 条件 没拼接where条件,对应代码里面 我猜测应该是mainTable被替换了

HillCheuang avatar Nov 27 '23 03:11 HillCheuang

你这个需求是 INNER JOIN 的需求吧

rowstop avatar Jan 02 '24 02:01 rowstop

优秀

keithJackTjk avatar Feb 19 '24 13:02 keithJackTjk

你这个需求是 INNER JOIN 的需求吧

你这么说好像确实 不过项目有些同学 喜欢用left join 我统一改掉了里面逻辑

HillCheuang avatar Feb 20 '24 03:02 HillCheuang

优秀

一起加油

HillCheuang avatar Feb 20 '24 03:02 HillCheuang