mybatis-plus
mybatis-plus copied to clipboard
BaseMultiTableInnerInterceptor【数据权限】 处理left join时,遇到join的表只会拼接到 on条件并不会拼接到where条件后 #5797
该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
修复效果的截屏
left join on... and 后面有是一样的效果,你为什么需要 where 后面再加一次?
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 |
left join on... and 后面有是一样的效果,你为什么需要 where 后面再加一次?
根据上面的回答,在某些实际业务中,需要有数据权限的表是用于在 left join 语句上... 进行聚合数据...,若 你没有数据权限查看此数据,我的理解是总体过滤好一点 。
https://github.com/baomidou/mybatis-plus/issues/5186 可以看另外一个issue 有点类似于这个问题,不过这个是 只拼接了on 条件 没拼接where条件,对应代码里面 我猜测应该是mainTable被替换了
你这个需求是 INNER JOIN 的需求吧
优秀
你这个需求是 INNER JOIN 的需求吧
你这么说好像确实 不过项目有些同学 喜欢用left join 我统一改掉了里面逻辑
优秀
一起加油