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 | 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 | /** | ... | ... |