浏览代码

增加一个字段表达式排序方法.

https://github.com/baomidou/mybatis-plus/issues/6805
聂秋荣 1 月之前
父节点
当前提交
dae64de11d

+ 59 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/OrderItem.java

@@ -44,18 +44,76 @@ public class OrderItem implements Serializable {
      */
     private boolean asc = true;
 
+    public OrderItem() {
+    }
+
+    /**
+     * @since 3.5.13
+     * @param column 字段
+     * @param asc 是否升序
+     */
+    private OrderItem(String column, boolean asc) {
+        this.column = column;
+        this.asc = asc;
+    }
+
+    /**
+     * 根据指定字段升序排序
+     * @param column 数据库字段
+     * @return 排序字段
+     */
     public static OrderItem asc(String column) {
         return build(column, true);
     }
 
+    /**
+     * 根据指定字段降序排序
+     * @param column 数据库字段
+     * @return 排序字段
+     */
     public static OrderItem desc(String column) {
         return build(column, false);
     }
 
+    /**
+     * 根据表达式排序
+     * <p>任意表达式语句,自行控制SQL注入</p>
+     * <p>不适用与反序列</p>
+     * @since 3.5.13
+     * @param expression 字段表达式
+     * @return 排序字段
+     */
+    public static OrderItem withExpression(String expression) {
+        return withExpression(expression, false);
+    }
+
+    /**
+     * 根据表达式排序
+     * <p>任意表达式语句,自行控制SQL注入</p>
+     * <p>不适用与反序列</p>
+     * @since 3.5.13
+     * @param expression 字段表达式
+     * @param asc 是否正序
+     * @return 排序字段
+     */
+    public static OrderItem withExpression(String expression, boolean asc) {
+        return new OrderItem(expression, asc);
+    }
+
+    /**
+     * 根据指定字段列表进行升序排序
+     * @param columns 字段列表
+     * @return 排序字段
+     */
     public static List<OrderItem> ascs(String... columns) {
         return Arrays.stream(columns).map(OrderItem::asc).collect(Collectors.toList());
     }
 
+    /**
+     * 根据指定字段列表进行降序排序
+     * @param columns 字段列表
+     * @return 排序字段
+     */
     public static List<OrderItem> descs(String... columns) {
         return Arrays.stream(columns).map(OrderItem::desc).collect(Collectors.toList());
     }
@@ -65,6 +123,7 @@ public class OrderItem implements Serializable {
     }
 
     public OrderItem setColumn(String column) {
+        // TODO 反序列化会到这里被处理,后期重构需要改动
         this.column = StringUtils.replaceAllBlank(column);
         return this;
     }

+ 19 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -12,6 +12,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.test.h2.mapper.H2UserMapper;
 import org.apache.ibatis.exceptions.PersistenceException;
 import org.apache.ibatis.exceptions.TooManyResultsException;
@@ -961,4 +962,22 @@ class H2UserTest extends BaseTest {
         Assertions.assertEquals(userService.getById(id).getName(), "test-3");
     }
 
+    @Test
+    void testOrderByExpression() {
+        Page<H2User> page = new Page<>();
+        page.addOrder(OrderItem.withExpression("""
+            CASE
+              WHEN age > 1 THEN 2
+              WHEN age < 1 THEN 1
+            END
+            """));
+        page.addOrder(OrderItem.withExpression("""
+            CASE
+              WHEN name IS NOT NULL THEN 0
+              ELSE 1
+            END
+            """, false));
+        Assertions.assertDoesNotThrow(() -> userService.page(page));
+    }
+
 }