使用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 方法

相关推荐
johnrui14 小时前
JUC之AQS
java·开发语言·jvm
Full Stack Developme14 小时前
Spring 模块介绍
java·后端·spring
多敲代码防脱发14 小时前
Spring进阶(BeanFactory与ApplicationContext)
java·数据库·spring boot·后端·spring
吴声子夜歌14 小时前
Java——反射
java·反射
JAVA面经实录91715 小时前
完整版JVM 深度学习体系(二)
java·jvm
.ZGR.15 小时前
线程池相关知识及并发统计案例实现
java·开发语言
Mr_pyx15 小时前
面试题记录
jvm·数据结构·算法·spring·mybatis
慕言手记15 小时前
IDEA 插件常用-2026版
java·ide·spring boot·intellij-idea·idea·intellij idea
颖火虫盟主15 小时前
Hello World MCP Server 实现总结
java·前端·python
iiiiyu15 小时前
⾯向对象和集合编程题
java·大数据·开发语言·数据结构·编程语言