使用mybatis-plus,实现将排序时,字段值为NULL的数据排在最后

背景

业务需要根据一个时间字段进行排序,该字段非必填,使用 mybatis 默认排序规则,会将值为 NULL 的数据排在最前面,希望升序时,值为 NULL 的数据排在最后。

实现

错误实现

由于项目使用 mybatis-plus 进行查询,最开始想到的就是使用.last()方法,但试验后发现不行,在最后拼接语句,依旧会造成 NULL 值在最后

解决方案

查看 mybatis-plus 源码,发现其底层的实现思路是

发现 wrapper 中可以直接获取这个 expression

直接模仿该方法即可,将 NULL 值排序到最后的操作,放在排序规则第一个

实现

java 复制代码
    /**
     * 排序时,将字段column为null的数据排到最后面
     * <pre>
     *     ORDER BY
     *             age DESC,
     *             CASE WHEN age IS NULL THEN 1 ELSE 0 END ASC
     *
     * </pre>
     *
     * @since 3.8.0.RC5
     */
    private static final String ORDER_POST_NULL = "CASE WHEN {} IS NULL THEN 1 ELSE 0 END";

    /**
     * 排序时,将为字段column中,值为null的数据排在最后
     *
     * @param column 排序字段
     * @return CASE 语句:CASE WHEN age IS NULL THEN 1 ELSE 0 END
     * @since 3.8.0.RC5
     */
    public static <T> String getOrderNullPostSql(SFunction<T, ?> column) {
        return StrUtil.format(ORDER_POST_NULL, NtsWrappers.getColumnName(column));
    }

    /**
     * 将字段column中,值为null的数据排在最后
     *
     * @param queryWrapper 查询条件构造器
     * @param column       排序字段
     * @param <T>          数据库实体类泛型
     * @since 3.8.0.RC5
     */
    public static <T> void orderNullPost(LambdaQueryWrapper<T> queryWrapper, SFunction<T, ?> column) {
        queryWrapper.getExpression().add(ORDER_BY, () -> getOrderNullPostSql(column), ASC);
    }

使用时,在调用 mybatis-plus 的排序方法前先调用 orderBullPost 方法

相关推荐
腻害兔5 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说10 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199411 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了12 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品12 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘12 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记12 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端