mybatisplus多条件排序
时间: 2025-03-24 13:10:27 浏览: 36
### MyBatisPlus 实现多字段排序的方式
在 MyBatis-Plus 中,可以通过 `QueryWrapper` 或者 `LambdaQueryWrapper` 来实现多字段排序的功能。以下是具体的实现方式以及代码示例。
#### 使用 QueryWrapper 进行多字段排序
通过调用 `orderByAsc` 和 `orderByDesc` 方法可以分别设置升序和降序排列的字段。支持链式调用来指定多个排序字段。
```java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
public class UserService {
public List<User> getUsersSorted() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 设置按照 age 升序,name 降序排序
queryWrapper.orderByAsc("age").orderByDesc("name");
return userMapper.selectList(queryWrapper);
}
}
```
上述代码实现了基于两个字段 (`age`, `name`) 的排序功能[^1]。
---
#### 使用 LambdaQueryWrapper 进行多字段排序
如果希望避免硬编码字符串形式的字段名,推荐使用 `LambdaQueryWrapper`,它能够提供编译期的安全性并减少拼写错误的风险。
```java
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
public class UserService {
public List<User> getUsersSortedWithLambda() {
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 按照 User 对象中的属性进行排序 (age 升序, name 降序)
lambdaQueryWrapper.orderByAsc(User::getAge).orderByDesc(User::getName);
return userMapper.selectList(lambdaQueryWrapper);
}
}
```
此方法利用 Java 函数式接口特性简化了 SQL 构建过程,并增强了代码可读性和维护性[^2]。
---
#### 动态条件下的多字段排序
当需要根据运行时参数决定如何排序时,可以在构建查询对象之前加入判断逻辑:
```java
public List<User> getDynamicSortUsers(String sortField, boolean isAsc) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
if ("age".equals(sortField)) {
if (isAsc) {
wrapper.orderByAsc(User::getAge);
} else {
wrapper.orderByDesc(User::getAge);
}
} else if ("name".equals(sortField)) {
if (isAsc) {
wrapper.orderByAsc(User::getName);
} else {
wrapper.orderByDesc(User::getName);
}
}
return userMapper.selectList(wrapper);
}
```
这种方法允许灵活调整排序策略而无需修改核心业务逻辑[^3]。
---
### 注意事项
- 如果涉及分页操作,则需结合 `Page<T>` 类型一起使用,例如 `userMapper.selectPage(pageObject, queryWrapper)`。
- 排序字段应确保存在于实体类映射表结构中;否则会抛出异常或返回不预期的结果。
---
阅读全文
相关推荐


















