news 2026/11/1 9:56:43

MyBatis-Plus中实现自定义复杂排序逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis-Plus中实现自定义复杂排序逻辑

在使用MyBatis-Plus进行数据库操作时,有时我们需要根据复杂的条件进行数据排序,特别是当排序条件不仅仅基于单一字段,而是需要多个字段和特定的排序规则时。本文将通过一个实际的例子说明如何在MyBatis-Plus中实现这种复杂的排序逻辑。

场景描述

假设我们有一个车辆保险信息的查询功能,需要根据gateNo进行排序。gateNo字段的格式为X-YYY,其中X可以是数字或特殊字符串(如“天”),YYY是一个数字。我们的目标是按X的数值排序,将X为“天”的情况排在最后,同时YYY也需要按数值进行排序。

解决方案

在MyBatis-Plus中,QueryWrapper提供了丰富的方法来构建查询条件,但对于复杂的排序逻辑,我们需要利用原始SQL片段来实现。以下是具体的实现步骤和代码:

步骤1:定义QueryWrapper

首先,我们创建一个QueryWrapper实例。如果查询模型(model)为空,我们直接返回一个空的QueryWrapper实例。

QueryWrapper<VCzInsuranceEntity>queryWrapper=newQueryWrapper<>();if(model==null){returnqueryWrapper;}

步骤2:添加自定义排序逻辑

为了根据gateNo进行排序,我们使用last方法来添加自定义的SQL排序片段。这里使用CASE语句来处理特殊值“天”,并使用CAST函数和SUBSTRING_INDEX来分离和转换字符串为数值。

StringcustomOrderSql="CASE WHEN gate_no LIKE '天-%' THEN 2 ELSE 1 END, "+"CAST(SUBSTRING_INDEX(gate_no, '-', 1) AS UNSIGNED), "+"CAST(SUBSTRING_INDEX(gate_no, '-', -1) AS UNSIGNED)";queryWrapper.last("ORDER BY "+customOrderSql);

详细解释

  1. 特殊值处理:

使用 CASE 语句判断 gate_no 是否以“天-”开头。如果是,则赋值为 2,这样的记录会被排在查询结果的最后。

  1. 按 X 排序:

使用 SUBSTRING_INDEX 函数提取 gate_no 中 ‘-’ 前的部分(即 X),然后用 CAST 函数将其转换为无符号整数,确保按数值进行排序。

  1. 按 YYY 排序:

同样使用 SUBSTRING_INDEX 函数但这次提取 ‘-’ 后的部分(即 YYY),再通过 CAST 进行数值转换,保证在相同的 X 内部,根据 YYY 的值进行排序。

步骤3:添加其他查询条件

在实际的应用场景中,除了排序之外,我们通常还需要根据多个字段添加过滤条件。例如,我们可以根据车辆ID、所有者ID和其他相关字段来过滤数据。这里为了简化,我们只展示几个示例条件:

queryWrapper.eq(model.getCarId()!=null&&model.getCarId()!=0,"car_id",model.getCarId()).like(StringUtils.isNotBlank(model.getLicensePlate()),"license_plate",model.getLicensePlate());

完整方法

将以上步骤组合,我们得到了一个完整的方法,用于构建带有自定义排序的查询包装器:

@OverridepublicQueryWrapper<VCzInsuranceEntity>onSelectWhere(VCzInsuranceEntitymodel){QueryWrapper<VCzInsuranceEntity>queryWrapper=newQueryWrapper<>();if(model==null){returnqueryWrapper;}StringcustomOrderSql="CASE WHEN gate_no LIKE '天-%' THEN 2 ELSE 1 END, "+"CAST(SUBSTRING_INDEX(gate_no, '-', 1) AS UNSIGNED), "+"CAST(SUBSTRING_INDEX(gate_no, '-', -1) AS UNSIGNED)";queryWrapper.last("ORDER BY "+customOrderSql);queryWrapper.eq(model.getCarId()!=null&&model.getCarId()!=0,"car_id",model.getCarId()).like(StringUtils.isNotBlank(model.getLicensePlate()),"license_plate",model.getLicensePlate());returnqueryWrapper;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 7:51:10

VS Code Remote-SSH 远程开发 + Codex 登录完整指南

在远程服务器开发代码时&#xff0c;很多开发者会使用 VS Code Remote-SSH 来进行远程开发。同时&#xff0c;一些 AI Coding 插件&#xff08;如 Codex、Copilot 等&#xff09;需要访问在线服务&#xff0c;因此在远程开发环境中经常会遇到以下问题&#xff1a;插件登录后一直…

作者头像 李华
网站建设 2026/11/1 9:50:25

LiuJuan20260223Zimage网站内容分析与SEO优化建议生成

LiuJuan20260223Zimage网站内容分析与SEO优化建议生成 1. 引言&#xff1a;当网站运营遇上AI助手 你有没有过这样的经历&#xff1f;辛辛苦苦写了一篇网站文章&#xff0c;发布后满怀期待地刷新后台&#xff0c;结果流量数据却纹丝不动&#xff0c;甚至还不如一篇随手转载的旧…

作者头像 李华
网站建设 2026/10/20 11:34:39

(三)OpenClaw 云端服务器控制本地 Windows 浏览器完整配置指南

适用场景&#xff1a;OpenClaw Gateway 部署在云端服务器&#xff08;Linux&#xff09;&#xff0c;通过节点代理方式远程控制本地 Windows 电脑上的浏览器&#xff0c;实现 AI 自动化操控本地网页。 本文环境&#xff1a; 云端服务器&#xff1a;Debian/Ubuntu Linux本地电脑…

作者头像 李华
网站建设 2026/10/20 11:31:19

2026年TikTok出海生死劫:90%卖家折戟背后,藏着怎样的突围真相?

2025年是TikTok Shop全球化版图的一个“奇迹年”&#xff0c;也是无数跨境卖家的“清算年”。根据eMarketer的最新预测&#xff0c;TikTok Shop在面临监管波动的重重压力下&#xff0c;全球GMV依然冲破了802亿美元&#xff0c;同比增长65%&#xff0c;增速领跑海外所有主流电商…

作者头像 李华