diff --git a/mapper/src/main/java/io/mybatis/mapper/example/Example.java b/mapper/src/main/java/io/mybatis/mapper/example/Example.java index bbd438b..0de39b3 100644 --- a/mapper/src/main/java/io/mybatis/mapper/example/Example.java +++ b/mapper/src/main/java/io/mybatis/mapper/example/Example.java @@ -19,11 +19,11 @@ import io.mybatis.mapper.fn.Fn; import io.mybatis.provider.EntityColumn; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; +import java.util.function.Supplier; import java.util.regex.Matcher; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static io.mybatis.provider.EntityTable.DELIMITER; @@ -272,6 +272,42 @@ public Example orderBy(Fn fn, Order order) { return this; } + /** + * 用于一些非常规的排序 或 简单的字符串形式的排序
+ * 本方法 和 example.setOrderByClause 方法的区别是 本方法不会覆盖已有的排序内容
+ * eg: ORDER BY status = 5 DESC 即将 status = 5 的放在最前面
+ * 此时入参为:
example.orderBy("status = 5 DESC")
+ * @param orderByCondition 字符串排序表达式 + * @return Example + */ + public Example orderBy(String orderByCondition) { + if (orderByCondition != null && orderByCondition.length() > 0) { + if (orderByClause == null) { + orderByClause = ""; + } else { + orderByClause += ", "; + } + orderByClause += orderByCondition; + } + return this; + } + + + /** + * 用于一些特殊的非常规的排序,排序字符串需要通过一些函数或者方法来构造出来
+ * eg: ORDER BY FIELD(id,3,1,2) 即将 id 按照 3,1,2 的顺序排序
+ * 此时入参为:
example.orderBy(()-> {
+   * return Stream.of(3,1,2)
+   *              .map(Objects::toString)
+   *              .collect(Collectors.joining("," , "FIELD( id ," , ")"));
+   * })
+ * @param orderByCondition 字符串排序表达式 + * @return Example + */ + public Example orderBy(Supplier orderByCondition) { + return orderBy(orderByCondition.get()); + } + /** * 通过方法引用方式设置排序字段,升序排序 * diff --git a/mapper/src/main/java/io/mybatis/mapper/example/ExampleWrapper.java b/mapper/src/main/java/io/mybatis/mapper/example/ExampleWrapper.java index 950ad81..590c5b1 100644 --- a/mapper/src/main/java/io/mybatis/mapper/example/ExampleWrapper.java +++ b/mapper/src/main/java/io/mybatis/mapper/example/ExampleWrapper.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Optional; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -92,6 +93,36 @@ public ExampleWrapper orderBy(Fn fn, Example.Order order) { return this; } + /** + * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案 + * @param orderByCondition 排序字符串(不会覆盖已有的排序内容) + * @return Example + */ + public ExampleWrapper orderBy(String orderByCondition) { + this.example.orderBy(orderByCondition); + return this; + } + + /** + * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案 + * @param orderByCondition 排序字符串构造方法,比如通过数组集合循环拼接等 + * @return Example + */ + public ExampleWrapper orderBy(Supplier orderByCondition) { + this.example.orderBy(orderByCondition); + return this; + } + + /** + * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案 + * @param useOrderBy 条件表达式,true使用,false不使用 字符串排序 + * @param orderByCondition 排序字符串构造方法,比如通过数组集合循环拼接等 + * @return Example + */ + public ExampleWrapper orderBy(boolean useOrderBy, Supplier orderByCondition) { + return useOrderBy ? this.orderBy(orderByCondition) : this; + } + /** * 通过方法引用方式设置排序字段,升序排序 *