Browse Source

order by wrapper 存在条件不排序问题处理

hubin 3 years ago
parent
commit
b1e2e10cdc

+ 4 - 1
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/OrderBy.java

@@ -14,8 +14,11 @@ import java.lang.annotation.*;
 public @interface OrderBy {
 
     /**
-     * 是否倒序查询,默认是
+     * 默认倒序,设置 true 顺序
      */
+    boolean asc() default false;
+
+    @Deprecated
     boolean isDesc() default true;
 
     /**

+ 16 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -15,6 +15,7 @@
  */
 package com.baomidou.mybatisplus.core.conditions;
 
+import com.baomidou.mybatisplus.annotation.OrderBy;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Func;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Join;
@@ -566,6 +567,21 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
         expression.add(sqlSegments);
     }
 
+    /**
+     * 是否使用默认注解 {@link OrderBy} 排序
+     *
+     * @return true 使用 false 不使用
+     */
+    public boolean isUseAnnotationOrderBy() {
+        final String _sqlSegment = this.getSqlSegment();
+        if (StringUtils.isBlank(_sqlSegment)) {
+            return true;
+        }
+        final String _sqlSegmentToUpperCase = _sqlSegment.toUpperCase();
+        return !(_sqlSegmentToUpperCase.contains(Constants.ORDER_BY)
+            || _sqlSegmentToUpperCase.contains(Constants.LIMIT));
+    }
+
     @Override
     public String getSqlSegment() {
         return expression.getSqlSegment() + lastSql.getStringValue();

+ 0 - 14
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/MergeSegments.java

@@ -15,10 +15,7 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
-import com.baomidou.mybatisplus.annotation.OrderBy;
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -61,17 +58,6 @@ public class MergeSegments implements ISqlSegment {
         cacheSqlSegment = false;
     }
 
-    /**
-     * 是否使用默认注解 {@link OrderBy} 排序
-     *
-     * @return true 使用 false 不使用
-     */
-    public boolean isUseAnnotationOrderBy() {
-        final String _sqlSegment = this.getSqlSegment();
-        return CollectionUtils.isEmpty(orderBy) && null != _sqlSegment
-            && _sqlSegment.toLowerCase().contains(Constants.LIMIT);
-    }
-
     @Override
     public String getSqlSegment() {
         if (cacheSqlSegment) {

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -254,8 +254,8 @@ public abstract class AbstractMethod implements Constants {
         sql.append(orderByFields.stream().map(tfi -> String.format("%s %s", tfi.getColumn(),
             tfi.getOrderByType())).collect(joining(",")));
         /* 当wrapper中传递了orderBy属性,@orderBy注解失效 */
-        return SqlScriptUtils.convertIf(sql.toString(), String.format("%s == null or %s == null or %s == null",
-            WRAPPER, WRAPPER_EXPRESSION, WRAPPER_EXPRESSION_ORDER), true);
+        return SqlScriptUtils.convertIf(sql.toString(), String.format("%s == null or %s", WRAPPER,
+            WRAPPER_EXPRESSION_ORDER), true);
     }
 
     /**

+ 5 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -372,7 +372,11 @@ public class TableFieldInfo implements Constants {
         if (null != orderBy) {
             this.isOrderBy = true;
             this.orderBySort = orderBy.sort();
-            this.orderByType = orderBy.isDesc() ? "desc" : "asc";
+            String _orderBy = Constants.DESC;
+            if (orderBy.asc() || !orderBy.isDesc()) {
+                _orderBy = Constants.ASC;
+            }
+            this.orderByType = _orderBy;
         } else {
             this.isOrderBy = false;
         }

+ 13 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Constants.java

@@ -96,14 +96,10 @@ public interface Constants extends StringPool, Serializable {
      * wrapper 类的属性 entity 带后缀 ==> .
      */
     String WRAPPER_ENTITY_DOT = WRAPPER_DOT + "entity" + DOT;
-    /**
-     * wrapper 类的属性 expression
-     */
-    String WRAPPER_EXPRESSION = WRAPPER_DOT + "expression";
     /**
      * wrapper 类的属性 expression 下级属性 order
      */
-    String WRAPPER_EXPRESSION_ORDER = WRAPPER_EXPRESSION + DOT + "useAnnotationOrderBy";
+    String WRAPPER_EXPRESSION_ORDER = WRAPPER_DOT + "useAnnotationOrderBy";
     /**
      * UpdateWrapper 类的属性 sqlSet
      */
@@ -140,7 +136,18 @@ public interface Constants extends StringPool, Serializable {
      * limit
      */
     String LIMIT = "LIMIT";
-
+    /**
+     * order by
+     */
+    String ORDER_BY = "ORDER BY";
+    /**
+     * asc
+     */
+    String ASC = "ASC";
+    /**
+     * desc
+     */
+    String DESC = "DESC";
     /**
      * 乐观锁字段
      */

+ 2 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2StudentMapperTest.java

@@ -102,7 +102,8 @@ class H2StudentMapperTest extends BaseTest {
         LambdaQueryWrapper<H2Student> wrapper = Wrappers.<H2Student>lambdaQuery().groupBy(H2Student::getAge);
         LambdaQueryWrapper<H2Student> wrapper2 = Wrappers.<H2Student>lambdaQuery().orderByAsc(H2Student::getAge);
         System.out.println(wrapper.getSqlSegment());
-        System.out.println(wrapper2.getSqlSegment());
+        Assertions.assertEquals(" GROUP BY age", wrapper.getSqlSegment());
+        Assertions.assertEquals(" ORDER BY age ASC", wrapper2.getSqlSegment());
     }
 
     @Test

+ 4 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/LastSqlTest.java

@@ -98,6 +98,10 @@ public class LastSqlTest {
     public void selectListOrderBy() {
         List<H2Student> h2Students = mapper.selectList(null);
         Assertions.assertEquals(h2Students.size(), 6);
+        Assertions.assertEquals(mapper.selectList(new LambdaQueryWrapper<H2Student>()
+            .eq(H2Student::getAge, 1)).size(), 6);
+        Assertions.assertEquals(mapper.selectList(new QueryWrapper<H2Student>()
+            .orderByAsc("age")).size(), 6);
     }
 
     @Test