当前位置: 首页 > article >正文

按照状态实现自定义排序的方法

方法一:使用 MyBatis-Plus 的 QueryWrapper 自定义排序

在查询时动态构建排序规则,通过 CASE WHEN 语句实现优先级排序:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;@Service
public class ProjectConfigService {public List<ProjectConfigEntity> listProjectsByStatusPriority() {// 自定义排序:进行中(1) > 已完成(2) > 待启动(0)QueryWrapper<ProjectConfigEntity> queryWrapper = new QueryWrapper<>();queryWrapper.orderByAsc("CASE " +"WHEN project_status = 1 THEN 1 " +  // 进行中排第一"WHEN project_status = 2 THEN 2 " +  // 已完成排第二"ELSE 3 END");                      // 待启动排第三return projectConfigMapper.selectList(queryWrapper);}
}

方法二:在实体类中使用 @TableField 注解添加默认排序

如果你希望所有查询都自动应用此排序规则,可以在实体类中添加默认排序注解:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;@Data
@TableName("dste_project_config_new")
public class ProjectConfigEntity implements Serializable {private static final long serialVersionUID = 1L;// 其他字段保持不变.../*** 项目状态(0:待启动,1:进行中,2:已完成)*/@TableField(value = "project_status", condition = "%s = CASE WHEN project_status = 1 THEN 1 " +"WHEN project_status = 2 THEN 2 " +"ELSE 3 END")private Integer projectStatus;
}

方法三:使用自定义 SQL 查询

如果你需要更复杂的排序逻辑,可以在 Mapper 接口中定义自定义 SQL:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;public interface ProjectConfigMapper extends BaseMapper<ProjectConfigEntity> {@Select("SELECT * FROM dste_project_config_new " +"ORDER BY CASE " +"WHEN project_status = 1 THEN 1 " +"WHEN project_status = 2 THEN 2 " +"ELSE 3 END")List<ProjectConfigEntity> selectProjectsByStatusPriority();
}

方法四:使用 MyBatis-Plus 的 LambdaQueryWrapper自定义排序

    public List<ProjectConfigEntity> listProjectsByStatusPriority() {// 使用LambdaQueryWrapper实现类型安全的自定义排序LambdaQueryWrapper<ProjectConfigEntity> wrapper = new LambdaQueryWrapper<>();wrapper.orderByAsc(true, "CASE " +"WHEN project_status = 1 THEN 1 " +  // 进行中排第一"WHEN project_status = 2 THEN 2 " +  // 已完成排第二"ELSE 3 END");return projectConfigMapper.selectList(wrapper);}

方法五:避免硬编码表字段名,可以结合实体类的属性名和 SQL 片段

	LambdaQueryWrapper<ProjectConfigEntity> wrapper = new LambdaQueryWrapper<>();String statusSortSql = String.format("CASE " +"WHEN %s = 1 THEN 1 " +"WHEN %s = 2 THEN 2 " +"ELSE 3 END",StringUtils.camelToUnderline(ProjectConfigEntity::getProjectStatus), // 驼峰转下划线StringUtils.camelToUnderline(ProjectConfigEntity::getProjectStatus));wrapper.orderByAsc(true, statusSortSql);

排序原理说明

以上五种方法均基于 SQL 的 CASE WHEN 语句实现自定义排序:

  1. 进行中(状态值=1):优先级最高,排序值为 1
  2. 已完成(状态值=2):优先级次之,排序值为 2
  3. 待启动(状态值=0):优先级最低,排序值为 3
http://www.lryc.cn/news/2391643.html

相关文章:

  • 游戏引擎学习第313天:回到 Z 层级的工作
  • 论文阅读:arxiv 2024 SmoothLLM: Defending LLMs Against Jailbreaking Attacks
  • Milvus部署架构选择和Docker部署实战指南
  • 高效合并 Excel 表格实用工具
  • 【前端】Vue3 中实现两个组件的动态切换保活
  • 拉取gitlab项目
  • 树莓派(Raspberry Pi)安装Docker教程
  • 计算机视觉---YOLOv4
  • 在雄性小鼠自发脑网络中定位记忆巩固的因果中枢
  • 刷机维修进阶教程-----没有开启usb调试 如何在锁定机型的拨号界面特殊手段来开启ADB
  • Selenium 测试框架 - Kotlin
  • docker运行centos提示Operation not permitted
  • 010501上传下载_反弹shell-渗透命令-基础入门-网络安全
  • Flask集成Selenium实现网页截图
  • 机顶盒CM311-5s纯手机免拆刷机,全网通,当贝桌面
  • 知识图谱:AI时代语义认知的底层重构逻辑
  • centos7安装MySQL(保姆级教学)
  • 2025.5.23 【ZR NOI模拟赛 T3】高速公路 题解(容斥,高维前缀和,性质)
  • QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)
  • nova14 ultra,是如何防住80°C热水和10000KPa水压冲击的?
  • Spring Boot项目中实现单点登录(SSO)完整指南
  • Windows环境下Redis的安装使用与报错解决
  • 鸿蒙完整项目-仿盒马App(一)首页静态页面
  • 大模型(4)——Agent(基于大型语言模型的智能代理)
  • 39-居住证管理系统(小程序)
  • WPF【11_4】WPF实战-重构与美化(MVVM 架构)
  • 计算逆时针夹角(有向角度)——CAD c# 实现两条线(向量)的逆时针夹角
  • 鸿蒙OSUniApp 开发带有通知提示的功能组件#三方框架 #Uniapp
  • 前端EXCEL插件智表ZCELL数据源功能详解
  • 打卡第31天:模块和库的导入