mybatis-plus 指定列指定值排序

问题:由于使用mybatis-plus的查询功能,是通过封装querywrapper实现的,SQL可控性不高,有部分逻辑不好控制,例如排序。

方案:使用last方法补充尾部逻辑(https://baomidou.com/guide/wrapper.html#last

样例1:

通过更新时间和创建时间倒序排序

QueryWrapper<Employee> queryWrapper = QueryGenerator.initQueryWrapper(employee, req.getParameterMap());
queryWrapper.eq("ORG_ID",sysUser.getOrgCode());
queryWrapper.last("order by nvl2(update_time, update_time, create_time) desc");

样例2:

通过字段状态和创建时间排序(状态为在职的员工置顶,且按更新时间升序排序)

QueryWrapper<Employee> queryWrapper = QueryGenerator.initQueryWrapper(employee, req.getParameterMap());
queryWrapper.last("order by case when staff_status = '1' then 1 else 2 end, update_date asc"); // staff_status 1是在职 2是离职

 

### 使用 MyBatis-Plus 实现按列排序 MyBatis-Plus 提供了简洁的方式来实现数据库查询中的按列排序功能。通过 `Wrapper` 接口及其子类可以方便地构建复杂的查询条件,包括排序。 #### 方法一:使用 Wrapper 进行排序 可以通过 `QueryWrapper` 或者其他类型的 `Wrapper` 来排序字段以及升序或降序排列: ```java // 创建 QueryWrapper 对象并设置排序规则 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.orderByAsc("age"); // 升序 List<User> userList = userMapper.selectList(queryWrapper); ``` 如果需要多列排序,则可以在同一个 `orderBy` 调用中传入多个参数: ```java queryWrapper.orderBy(true, true, "age", "name"); // 第一个布尔值表示是否开启排序, // 后面接的是各个字段名称,默认为升序;若需降序可改为 false ``` 对于更复杂的需求,比如根据某些逻辑判断决定如何排序,也可以动态调整 `Wrapper` 中的内容[^1]。 #### 方法二:直接在 XML 映射文件中定义 SQL 语句 虽然这种方式不如利用 `Wrapper` 那样直观便捷,但在特定场景下仍然适用。可以直接编写带有 ORDER BY 子句的 SQL 查询,并将其映射到相应的 Mapper 方法上。 ```sql <select id="selectUsersWithOrderBy" resultType="User"> SELECT * FROM users WHERE deleted=0 <if test="sortColumn != null and sortOrder != null"> ORDER BY ${sortColumn} ${sortOrder} </if> </select> ``` 对应的 Java 代码如下所示: ```java public interface UserMapper extends BaseMapper<User> { List<User> selectUsersWithOrderBy(@Param("sortColumn") String sortColumn, @Param("sortOrder") String sortOrder); } // 调用此方法时传递具体的列名和顺序即可完成排序操作 userMapper.selectUsersWithOrderBy("create_time", "desc"); ``` 这种方法允许更加灵活地控制最终执行的 SQL 文本,但也需要注意防止 SQL 注入风险,在实际应用中建议优先考虑使用 `Wrapper` 方式处理简单至中等程度的排序需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值