Просмотр исходного кода

fix:【framework 框架】MyBatisUtils addOrder 时,未兼容 LambdaQueryWrapper 场景

YunaiV 1 год назад
Родитель
Сommit
2e47ffdba1

+ 26 - 5
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.SortingField;
 import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -47,16 +48,36 @@ public class MyBatisUtils {
         return page;
     }
 
+    @SuppressWarnings("PatternVariableCanBeUsed")
     public static <T> void addOrder(Wrapper<T> wrapper, Collection<SortingField> sortingFields) {
         if (CollUtil.isEmpty(sortingFields)) {
             return;
         }
-        QueryWrapper<T> query = (QueryWrapper<T>) wrapper;
-        for (SortingField sortingField : sortingFields) {
-            query.orderBy(true,
-                    SortingField.ORDER_ASC.equals(sortingField.getOrder()),
-                    StrUtil.toUnderlineCase(sortingField.getField()));
+        if (wrapper instanceof QueryWrapper<T>) {
+            QueryWrapper<T> query = (QueryWrapper<T>) wrapper;
+            for (SortingField sortingField : sortingFields) {
+                query.orderBy(true,
+                        SortingField.ORDER_ASC.equals(sortingField.getOrder()),
+                        StrUtil.toUnderlineCase(sortingField.getField()));
+            }
+        } else if (wrapper instanceof LambdaQueryWrapper<T>) {
+            // LambdaQueryWrapper 不直接支持字符串字段排序,使用 last 方法拼接 ORDER BY
+            LambdaQueryWrapper<T> lambdaQuery = (LambdaQueryWrapper<T>) wrapper;
+            StringBuilder orderBy = new StringBuilder();
+            for (SortingField sortingField : sortingFields) {
+                if (StrUtil.isNotEmpty(orderBy)) {
+                    orderBy.append(", ");
+                }
+                orderBy.append(StrUtil.toUnderlineCase(sortingField.getField()))
+                       .append(" ")
+                       .append(SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? "ASC" : "DESC");
+            }
+            lambdaQuery.last("ORDER BY " + orderBy);
+            // 另外个思路:https://blog.csdn.net/m0_59084856/article/details/138450913
+        } else {
+            throw new IllegalArgumentException("Unsupported wrapper type: " + wrapper.getClass().getName());
         }
+
     }
 
     /**