瀏覽代碼

修改租户插件拼装多个join时的错误

andanyang 1 年之前
父節點
當前提交
45bc5791e2

+ 5 - 6
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/BaseMultiTableInnerInterceptor.java

@@ -283,9 +283,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
         // 当前 join 的左表
         Table leftTable = null;
 
-        if (mainTables == null) {
-            mainTables = new ArrayList<>();
-        } else if (mainTables.size() == 1) {
+        if (mainTables.size() == 1) {
             mainTable = mainTables.get(0);
             leftTable = mainTable;
         }
@@ -320,6 +318,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
                 // 如果不要忽略,且是右连接,则记录下当前表
                 if (join.isRight()) {
                     mainTable = joinTable;
+                    mainTables.clear();
                     if (leftTable != null) {
                         onTables = Collections.singletonList(leftTable);
                     }
@@ -330,12 +329,12 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
                         onTables = Arrays.asList(mainTable, joinTable);
                     }
                     mainTable = null;
+                    mainTables.clear();
                 } else {
                     onTables = Collections.singletonList(joinTable);
                 }
 
-                mainTables = new ArrayList<>();
-                if (mainTable != null) {
+                if (mainTable != null && !mainTables.contains(mainTable)) {
                     mainTables.add(mainTable);
                 }
 
@@ -346,7 +345,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
                     List<Expression> onExpressions = new LinkedList<>();
                     onExpressions.add(builderExpression(originOnExpressions.iterator().next(), onTables, whereSegment));
                     join.setOnExpressions(onExpressions);
-                    leftTable = joinTable;
+                    leftTable = mainTable == null ? joinTable : mainTable;
                     continue;
                 }
                 // 表名压栈,忽略的表压入 null,以便后续不处理

+ 1 - 1
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptorTest.java

@@ -259,7 +259,7 @@ class TenantLineInnerInterceptorTest {
                 "right join entity2 e2 on e1.id = e2.id",
             "SELECT * FROM entity e " +
                 "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
-                "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " +
+                "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 " +
                 "WHERE e2.tenant_id = 1");
 
         assertSql("SELECT * FROM entity e " +