소스 검색

多租户子查询

miemie 4 년 전
부모
커밋
4d2fdf9441

+ 1 - 1
build.gradle

@@ -88,7 +88,7 @@ ext {
 
 allprojects {
     group = 'com.baomidou'
-    version = "3.4.0.1-SNAPSHOT"
+    version = "3.4.0.2-SNAPSHOT"
 }
 
 description = "Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作"

+ 13 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.extension.toolkit.PropertyMapper;
 import lombok.*;
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.NotExpression;
 import net.sf.jsqlparser.expression.Parenthesis;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
 import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
@@ -255,6 +256,12 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
      * 5. >=
      * 6. <=
      * 7. <>
+     * 8. EXISTS
+     * 9. NOT EXISTS
+     * <p>
+     * 前提条件:
+     * 1. 子查询必须放在小括号中
+     * 2. 子查询一般放在比较操作符的右边
      *
      * @param where where 条件
      */
@@ -282,6 +289,12 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
             } else if (where instanceof ComparisonOperator) {
                 ComparisonOperator expression = (ComparisonOperator) where;
                 processWhere(expression.getRightExpression());
+            } else if (where instanceof ExistsExpression) {
+                ExistsExpression expression = (ExistsExpression) where;
+                processWhere(expression.getRightExpression());
+            } else if (where instanceof NotExpression) {
+                NotExpression expression = (NotExpression) where;
+                processWhere(expression.getExpression());
             }
         }
     }

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

@@ -80,30 +80,41 @@ class TenantLineInnerInterceptorTest {
 
     @Test
     void selectSubSelect() {
+        // in
         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " +
                 "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
             "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " +
                 "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
-
+        // =
         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id = " +
                 "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
             "SELECT * FROM entity e WHERE e.id = ? AND e.id = " +
                 "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
-
+        // >=
         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id >= " +
                 "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
             "SELECT * FROM entity e WHERE e.id = ? AND e.id >= " +
                 "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
-
+        // <=
         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id <= " +
                 "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
             "SELECT * FROM entity e WHERE e.id = ? AND e.id <= " +
                 "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
-
+        // <>
         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id <> " +
                 "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
             "SELECT * FROM entity e WHERE e.id = ? AND e.id <> " +
                 "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
+        // EXISTS
+        assertSql("SELECT * FROM entity e WHERE e.id = ? and EXISTS " +
+                "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
+            "SELECT * FROM entity e WHERE e.id = ? AND EXISTS " +
+                "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
+        // NOT EXISTS
+        assertSql("SELECT * FROM entity e WHERE e.id = ? and NOT EXISTS " +
+                "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
+            "SELECT * FROM entity e WHERE e.id = ? AND NOT EXISTS " +
+                "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
     }
 
     @Test