瀏覽代碼

优化wrapper的sql生成

miemie 5 年之前
父節點
當前提交
432b79a325

+ 3 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/AbstractISegmentList.java

@@ -57,7 +57,7 @@ public abstract class AbstractISegmentList extends ArrayList<ISqlSegment> implem
     @Override
     public boolean addAll(Collection<? extends ISqlSegment> c) {
         List<ISqlSegment> list = new ArrayList<>(c);
-        boolean goon = transformList(list, list.get(0));
+        boolean goon = transformList(list, list.get(0), list.get(list.size() - 1));
         if (goon) {
             cacheSqlSegment = false;
             if (flushLastValue) {
@@ -73,9 +73,10 @@ public abstract class AbstractISegmentList extends ArrayList<ISqlSegment> implem
      *
      * @param list         传入进来的 ISqlSegment 集合
      * @param firstSegment ISqlSegment 集合里第一个值
+     * @param lastSegment  ISqlSegment 集合里最后一个值
      * @return true 是否继续向下执行; false 不再向下执行
      */
-    protected abstract boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment);
+    protected abstract boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment, ISqlSegment lastSegment);
 
     /**
      * 刷新属性 lastValue

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/GroupBySegmentList.java

@@ -32,7 +32,7 @@ import static java.util.stream.Collectors.joining;
 public class GroupBySegmentList extends AbstractISegmentList {
 
     @Override
-    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment) {
+    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment, ISqlSegment lastSegment) {
         list.remove(0);
         return true;
     }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/HavingSegmentList.java

@@ -33,7 +33,7 @@ import static java.util.stream.Collectors.joining;
 public class HavingSegmentList extends AbstractISegmentList {
 
     @Override
-    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment) {
+    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment, ISqlSegment lastSegment) {
         if (!isEmpty()) {
             this.add(SqlKeyword.AND);
         }

+ 3 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/MatchSegment.java

@@ -36,7 +36,9 @@ public enum MatchSegment {
     AND_OR(i -> i == SqlKeyword.AND || i == SqlKeyword.OR),
     EXISTS(i -> i == SqlKeyword.EXISTS),
     HAVING(i -> i == SqlKeyword.HAVING),
-    APPLY(i -> i == WrapperKeyword.APPLY);
+    APPLY(i -> i == WrapperKeyword.APPLY),
+    LEFT_BRACKET(i -> i == WrapperKeyword.LEFT_BRACKET),
+    RIGHT_BRACKET(i -> i == WrapperKeyword.RIGHT_BRACKET);
 
     private final Predicate<ISqlSegment> predicate;
 

+ 5 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/NormalSegmentList.java

@@ -40,7 +40,7 @@ public class NormalSegmentList extends AbstractISegmentList {
     }
 
     @Override
-    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment) {
+    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment, ISqlSegment lastSegment) {
         if (list.size() == 1) {
             /* 只有 and() 以及 or() 以及 not() 会进入 */
             if (!MatchSegment.NOT.match(firstSegment)) {
@@ -77,6 +77,10 @@ public class NormalSegmentList extends AbstractISegmentList {
             if (MatchSegment.APPLY.match(firstSegment)) {
                 list.remove(0);
             }
+            if (MatchSegment.LEFT_BRACKET.match(firstSegment) && MatchSegment.RIGHT_BRACKET.match(lastSegment)) {
+                list.remove(0);
+                list.remove(list.size() - 1);
+            }
         }
         return true;
     }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/OrderBySegmentList.java

@@ -32,7 +32,7 @@ import static java.util.stream.Collectors.joining;
 public class OrderBySegmentList extends AbstractISegmentList {
 
     @Override
-    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment) {
+    protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment, ISqlSegment lastSegment) {
         list.remove(0);
         if (!isEmpty()) {
             super.add(() -> COMMA);