下面是mybatis xml实现得:
select *
from prod_project_deploy
where del_flag=0
ORDER BY
FIELD(approval_status,0,3,2),IF(ISNULL(progress_status),1,0) ,
FIELD(progress_status,'测试1','测试2','测试3','测试4','测试5',''),
create_time desc
IF(ISNULL(progress_status),1,0) , --将null强制放在最后
需求是状态值是null得在后面 加上这句 后面得这个 FIELD(progress_status,‘测试1’,‘测试2’,‘测试3’,‘测试4’,‘测试5’,‘’), 空在最后才能生效
楼主开始想在java代码中实现,用了很多方法都不行
java尝试 如下。这个方式支持一种自定义排序 两种就失效了
// 自定义排序规则
String str = ApprovalStatusEnum.SAVE.getValue() + ","+ ApprovalStatusEnum.NOTPASS.getValue() + ","+ ApprovalStatusEnum.PASS.getValue();
List<String> statusOrder = Arrays.asList(StringUtils.split(str, ","));
String str1 = 测试1,测试2,测试3,测试4,测试5";
List<String> progressStatusOrder = Arrays.asList(StringUtils.split(str1, ","));
List<Test> tests= testMapper.selectList(wrapper);
tests.sort(Comparator.comparing((ProdProjectDeploy r) -> {
for (int i = 0; i < statusOrder.size(); i++) {
if (r.getApprovalStatus() == statusOrder.get(i)) {
return i;
}
}
return statusOrder.size(); // 返回一个不在自定义数组中的值,表示未找到的情况
})
.thenComparing(r -> {
for (int j = 0; j < progressStatusOrder.size(); j++) {
if (r.getProgressStatus() == progressStatusOrder.get(j)) {
return j;
}
}
return progressStatusOrder.size(); // 同上
}).thenComparing(Test::getCreateTime).reversed());
欢迎交流,如果java能实现就太棒了