Commit 2e47ffdba1b9b92a15c6d94f6caa8a97d6978efc

Authored by YunaiV
1 parent b5d5fa8e

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

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;
9 9 import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
10 10 import com.baomidou.mybatisplus.annotation.DbType;
11 11 import com.baomidou.mybatisplus.core.conditions.Wrapper;
  12 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
12 13 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
13 14 import com.baomidou.mybatisplus.core.metadata.OrderItem;
14 15 import com.baomidou.mybatisplus.core.toolkit.StringPool;
... ... @@ -47,16 +48,36 @@ public class MyBatisUtils {
47 48 return page;
48 49 }
49 50  
  51 + @SuppressWarnings("PatternVariableCanBeUsed")
50 52 public static <T> void addOrder(Wrapper<T> wrapper, Collection<SortingField> sortingFields) {
51 53 if (CollUtil.isEmpty(sortingFields)) {
52 54 return;
53 55 }
54   - QueryWrapper<T> query = (QueryWrapper<T>) wrapper;
55   - for (SortingField sortingField : sortingFields) {
56   - query.orderBy(true,
57   - SortingField.ORDER_ASC.equals(sortingField.getOrder()),
58   - StrUtil.toUnderlineCase(sortingField.getField()));
  56 + if (wrapper instanceof QueryWrapper<T>) {
  57 + QueryWrapper<T> query = (QueryWrapper<T>) wrapper;
  58 + for (SortingField sortingField : sortingFields) {
  59 + query.orderBy(true,
  60 + SortingField.ORDER_ASC.equals(sortingField.getOrder()),
  61 + StrUtil.toUnderlineCase(sortingField.getField()));
  62 + }
  63 + } else if (wrapper instanceof LambdaQueryWrapper<T>) {
  64 + // LambdaQueryWrapper 不直接支持字符串字段排序,使用 last 方法拼接 ORDER BY
  65 + LambdaQueryWrapper<T> lambdaQuery = (LambdaQueryWrapper<T>) wrapper;
  66 + StringBuilder orderBy = new StringBuilder();
  67 + for (SortingField sortingField : sortingFields) {
  68 + if (StrUtil.isNotEmpty(orderBy)) {
  69 + orderBy.append(", ");
  70 + }
  71 + orderBy.append(StrUtil.toUnderlineCase(sortingField.getField()))
  72 + .append(" ")
  73 + .append(SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? "ASC" : "DESC");
  74 + }
  75 + lambdaQuery.last("ORDER BY " + orderBy);
  76 + // 另外个思路:https://blog.csdn.net/m0_59084856/article/details/138450913
  77 + } else {
  78 + throw new IllegalArgumentException("Unsupported wrapper type: " + wrapper.getClass().getName());
59 79 }
  80 +
60 81 }
61 82  
62 83 /**
... ...