方法一:使用 MyBatis-Plus 的 QueryWrapper 自定义排序
在查询时动态构建排序规则,通过 CASE WHEN
语句实现优先级排序:
java
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 注解添加默认排序
如果你希望所有查询都自动应用此排序规则,可以在实体类中添加默认排序注解:
java
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:
java
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自定义排序
java
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 片段
java
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