소스 검색

feature:exists和notExists支持参数绑定

raylax 4 년 전
부모
커밋
63734a0583

+ 33 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -22,7 +22,12 @@ import com.baomidou.mybatisplus.core.conditions.interfaces.Nested;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.enums.SqlKeyword;
 import com.baomidou.mybatisplus.core.enums.SqlKeyword;
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.enums.SqlLike;
-import com.baomidou.mybatisplus.core.toolkit.*;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape;
 import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape;
 
 
@@ -34,7 +39,29 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiPredicate;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Consumer;
 
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.AND;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ASC;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.BETWEEN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.DESC;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EQ;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EXISTS;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GROUP_BY;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.HAVING;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NOT_NULL;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NULL;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LIKE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT_BETWEEN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT_IN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT_LIKE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.OR;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
 import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
 import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
 import static java.util.stream.Collectors.joining;
 import static java.util.stream.Collectors.joining;
 
 
@@ -252,13 +279,13 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
     }
     }
 
 
     @Override
     @Override
-    public Children exists(boolean condition, String existsSql) {
-        return doIt(condition, EXISTS, () -> String.format("(%s)", existsSql));
+    public Children exists(boolean condition, String existsSql, Object... value) {
+        return doIt(condition, EXISTS, () -> String.format("(%s)", formatSql(existsSql, value)));
     }
     }
 
 
     @Override
     @Override
-    public Children notExists(boolean condition, String existsSql) {
-        return not(condition).exists(condition, existsSql);
+    public Children notExists(boolean condition, String existsSql, Object... value) {
+        return not(condition).exists(condition, existsSql, value);
     }
     }
 
 
     @Override
     @Override

+ 8 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Join.java

@@ -114,8 +114,8 @@ public interface Join<Children> extends Serializable {
     /**
     /**
      * ignore
      * ignore
      */
      */
-    default Children exists(String existsSql) {
-        return exists(true, existsSql);
+    default Children exists(String existsSql, Object... value) {
+        return exists(true, existsSql, value);
     }
     }
 
 
     /**
     /**
@@ -125,15 +125,16 @@ public interface Join<Children> extends Serializable {
      *
      *
      * @param condition 执行条件
      * @param condition 执行条件
      * @param existsSql sql语句
      * @param existsSql sql语句
+     * @param value 同apply
      * @return children
      * @return children
      */
      */
-    Children exists(boolean condition, String existsSql);
+    Children exists(boolean condition, String existsSql, Object... value);
 
 
     /**
     /**
      * ignore
      * ignore
      */
      */
-    default Children notExists(String existsSql) {
-        return notExists(true, existsSql);
+    default Children notExists(String existsSql, Object... value) {
+        return notExists(true, existsSql, value);
     }
     }
 
 
     /**
     /**
@@ -143,7 +144,8 @@ public interface Join<Children> extends Serializable {
      *
      *
      * @param condition 执行条件
      * @param condition 执行条件
      * @param existsSql sql语句
      * @param existsSql sql语句
+     * @param value 同apply
      * @return children
      * @return children
      */
      */
-    Children notExists(boolean condition, String existsSql);
+    Children notExists(boolean condition, String existsSql, Object... value);
 }
 }

+ 19 - 1
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/WrapperTest.java

@@ -26,7 +26,11 @@ import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
 
 
 import java.time.LocalDate;
 import java.time.LocalDate;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 
 class WrapperTest {
 class WrapperTest {
 
 
@@ -219,6 +223,20 @@ class WrapperTest {
         logSqlSegment("测试 empty 的 coll", queryWrapper, "(xxx IN ())");
         logSqlSegment("测试 empty 的 coll", queryWrapper, "(xxx IN ())");
     }
     }
 
 
+    @Test
+    void testExistsValue() {
+        QueryWrapper<User> wrapper = new QueryWrapper<>();
+        wrapper.eq("a", "b");
+        wrapper.exists("select 1 from xxx where id = {0} and name = {1}", 1, "Bob");
+        logSqlSegment("testExistsValue", wrapper, "(a = ? AND EXISTS (select 1 from xxx where id = ? and name = ?))");
+        logParams(wrapper);
+        wrapper = new QueryWrapper<>();
+        wrapper.eq("a", "b");
+        wrapper.notExists("select 1 from xxx where id = {0} and name = {1}", 1, "Bob");
+        logSqlSegment("testNotExistsValue", wrapper, "(a = ? AND NOT EXISTS (select 1 from xxx where id = ? and name = ?))");
+        logParams(wrapper);
+    }
+
     private List<Object> getList() {
     private List<Object> getList() {
         List<Object> list = new ArrayList<>();
         List<Object> list = new ArrayList<>();
         for (int i = 0; i < 2; i++) {
         for (int i = 0; i < 2; i++) {

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/AbstractChainWrapper.java

@@ -244,13 +244,13 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
     }
     }
 
 
     @Override
     @Override
-    public Children exists(boolean condition, String existsSql) {
+    public Children exists(boolean condition, String existsSql, Object... value) {
         getWrapper().exists(condition, existsSql);
         getWrapper().exists(condition, existsSql);
         return typedThis;
         return typedThis;
     }
     }
 
 
     @Override
     @Override
-    public Children notExists(boolean condition, String existsSql) {
+    public Children notExists(boolean condition, String existsSql, Object... value) {
         getWrapper().notExists(condition, existsSql);
         getWrapper().notExists(condition, existsSql);
         return typedThis;
         return typedThis;
     }
     }