Commit 2e47ffdba1b9b92a15c6d94f6caa8a97d6978efc
1 parent
b5d5fa8e
fix:【framework 框架】MyBatisUtils addOrder 时,未兼容 LambdaQueryWrapper 场景
Showing
1 changed file
with
26 additions
and
5 deletions
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,6 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.SortingField; | ||
| 9 | import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum; | 9 | import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum; |
| 10 | import com.baomidou.mybatisplus.annotation.DbType; | 10 | import com.baomidou.mybatisplus.annotation.DbType; |
| 11 | import com.baomidou.mybatisplus.core.conditions.Wrapper; | 11 | import com.baomidou.mybatisplus.core.conditions.Wrapper; |
| 12 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
| 12 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 13 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| 13 | import com.baomidou.mybatisplus.core.metadata.OrderItem; | 14 | import com.baomidou.mybatisplus.core.metadata.OrderItem; |
| 14 | import com.baomidou.mybatisplus.core.toolkit.StringPool; | 15 | import com.baomidou.mybatisplus.core.toolkit.StringPool; |
| @@ -47,16 +48,36 @@ public class MyBatisUtils { | @@ -47,16 +48,36 @@ public class MyBatisUtils { | ||
| 47 | return page; | 48 | return page; |
| 48 | } | 49 | } |
| 49 | 50 | ||
| 51 | + @SuppressWarnings("PatternVariableCanBeUsed") | ||
| 50 | public static <T> void addOrder(Wrapper<T> wrapper, Collection<SortingField> sortingFields) { | 52 | public static <T> void addOrder(Wrapper<T> wrapper, Collection<SortingField> sortingFields) { |
| 51 | if (CollUtil.isEmpty(sortingFields)) { | 53 | if (CollUtil.isEmpty(sortingFields)) { |
| 52 | return; | 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 | /** |