瀏覽代碼

ISqlSegmentList接管 order by 的处理

miemie 7 年之前
父節點
當前提交
9d51a7dd88

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

@@ -92,7 +92,6 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      */
     protected T entity;
     private ISqlSegmentList expression = new ISqlSegmentList();
-    private boolean didOrderBy = false;
 
     @Override
     public T getEntity() {
@@ -389,11 +388,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
         if (ArrayUtils.isEmpty(columns)) {
             return typedThis;
         }
-        if (condition && !didOrderBy) {
-            didOrderBy = true;
-            return doIt(true, ORDER_BY, () -> columnsToString(columns), isAsc ? ASC : DESC);
-        }
-        return doIt(condition, () -> ",", () -> columnsToString(columns), isAsc ? ASC : DESC);
+        return doIt(condition, ORDER_BY, () -> columnsToString(columns), isAsc ? ASC : DESC);
     }
 
     /**

+ 14 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ISqlSegmentList.java

@@ -38,6 +38,8 @@ public class ISqlSegmentList extends ArrayList<ISqlSegment> {
     private boolean automaticAnd = true;
     //最后一个值
     private ISqlSegment lastValue = null;
+    //是否启动过 order by
+    private boolean didOrderBy = false;
 
     public ISqlSegmentList() {
     }
@@ -50,12 +52,12 @@ public class ISqlSegmentList extends ArrayList<ISqlSegment> {
     public boolean addAll(Collection<? extends ISqlSegment> c) {
         if (automaticAnd) {
             ArrayList<? extends ISqlSegment> list = new ArrayList<>(c);
+            ISqlSegment sqlSegment = list.get(0);
             //只有一个元素
             if (list.size() == 1) {
                 /**
                  * 只有 and() 以及 or() 以及 not() 会进入
                  */
-                ISqlSegment sqlSegment = list.get(0);
                 if (!match(PredicateStrategy.NOT, sqlSegment)) {
                     //不是 not
                     if (isEmpty()) {
@@ -78,7 +80,17 @@ public class ISqlSegmentList extends ArrayList<ISqlSegment> {
                 }
             } else if (!match(PredicateStrategy.AND_OR, lastValue) && !isEmpty()) {
                 //多个元素
-                add(SqlKeyword.AND);
+                if (match(PredicateStrategy.ORDER_BY, sqlSegment)) {
+                    //处理 order by
+                    if (!didOrderBy) {
+                        didOrderBy = true;
+                    } else {
+                        list.remove(0);
+                        super.add(() -> ",");
+                    }
+                } else {
+                    add(SqlKeyword.AND);
+                }
             }
             //后置处理
             this.flushLastValue(list);

+ 3 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/WrapperTest.java

@@ -93,6 +93,9 @@ public class WrapperTest {
 
         logSqlSegment("嵌套测试,套内外手动拼接 or,去除套内第一个 or", new QueryWrapper<User>()
             .eq("id", 11).or(i -> i.or().eq("id", 1)).or().eq("id", 1));
+
+        logSqlSegment("多个 order by 拼接,", new QueryWrapper<User>()
+            .eq("id", 11).orderByAsc("id", "name", "sex").orderByAsc("age", "txl"));
     }
 
 //    public void test() {