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