方法一:使用 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
- 已完成(状态值=2):优先级次之,排序值为 2
- 待启动(状态值=0):优先级最低,排序值为 3