目录
方式一:用LambdaQueryWrapper.last()直接在末尾拼接
方式二:分别查出审核状态为办结和非办结数据进行排序,合成新的列表(推荐)
前言
在实际工作中遇到一个分页查询后需要先按字段1排序,再按字段2排序的问题。
1. 需求
查询业务的列表,先按审核状态(未审核[1],审核中[2],已审核[4](审核通过[10],审核不通过[11]))排序,将审核状态为已审核的状态排至最后,再按审核时间做降序排序。
2. controller
/**
* 用户列表查询接口
* @param userQuery
* @return
*/
@RequestMapping("list")
@ResponseBody
public Map<String,Object> userList(UserQuery userQuery){
return userService.userList(userQuery);
}
3. Service(错误的例子)
原先由于审核状态的字典项从未审核至已审核数字是递增的,所以我想着先对审核状态升序再对审核时间降序,如下:
public Map<String, Object> userList(UserQuery userQuery) {
IPage<User> page = new Page<User>(userQuery.getPage(),userQuery.getLimit());
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//有效
lambdaQueryWrapper.eq(User::getIsDel,0);
//按审核状态升序排序
lambdaQueryWrapper.orderByAsc(User::getAuditStatus);
//按审核时间降序排序
lambdaQueryWrapper.orderByDecs(User::getAuditTime);
page = this.baseMapper.selectPage(page,queryWrapper);
return PageResultUtil.getResult(page.getTotal(),page.getRecords());
}
序号 | 用户名 | 审核状态 | 审核时间 |
1 | 张三 | 未审核 | 2022/11/30 |
2 | 李四 | 未审核 | 2022/11/29 |
3 | 王五 | 审核中 | 2022/11/30 |
4 | 赵六 | 已审核 | 2022/11/30 |
得到如表格结果,结果并没有按照我希望的那样将审核状态与审核时间排序合并,而是分开独立排序后合并。我希望的结果是下面的样子:
序号 | 用户名 | 审核状态 | 审核时间 |
1 | 张三 | 未审核 | 2022/11/30 |
2 | 王五 | 审核中 | 2022/11/30 |
3 | 李四 | 未审核 | 2022/11/29 |
4 | 赵六 | 已审核 | 2022/11/30 |
所以上述方法有缺陷,接下来需要将两种排序合并。
4. Service
方式一:用LambdaQueryWrapper.last()直接在末尾拼接
注:此方式有sql注入风险,请谨慎使用!
public Map<String, Object> userList(UserQuery userQuery) {
IPage<User> page = new Page<User>(userQuery.getPage(),userQuery.getLimit());
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//有效
lambdaQueryWrapper.eq(User::getIsDel,0);
//按审核状态升序排序
//按审核时间降序排序
lambdaQueryWrapper.last("order by case when auditStatus in ('10','11') then 1 else 0 end ,auditTime desc");
page = this.baseMapper.selectPage(page,queryWrapper);
return PageResultUtil.getResult(page.getTotal(),page.getRecords());
}
方式二:分别查出审核状态为办结和非办结数据进行排序,合成新的列表(推荐)
public Map<String, Object> userList(UserQuery userQuery) {
//存放所需的业务列表
List<List<User>> userList = new ArrayList<>();
Page<User> page = new Page<>();
//存放办结状态
AuditVO finishAuditVO = new AuditVO();
finishAuditVO.getAuditStatusList().add("10");
finishAuditVO.getAuditStatusList().add("11");
//存放为办结状态
AuditVO notFinishAuditVO = new AuditVO();
notFinishAuditVO.getAuditStatusList().add("1");
notFinishAuditVO.getAuditStatusList().add("2");
//查询办结的业务
List<User> userFinishList = userService.getUserAuditStatusList(finishAuditVO);
//查询非办结的业务
List<User> userNotFinishList = userService.getUserAuditStatusList(notFinishAuditVO);
//将数据存放在userList中
userList.add(userFinishList);
userList.add(userNotFinishList);
page.setPages(userList.size()%userQuery.getLimit()==0?userList.size()/userQuery.getLimit():userList.size()/userQuery.getLimit()+1L);
page.setTotal((long)userList.size());
page.setRecords(userList);
return PageResultUtil.getResult(page.getPages(),page.getTotal(),page.getRecords());
}
public List<User> getUserAuditStatusList(AuditVO auditVO){
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.in(User::getAuditStatus, auditVO.getAuditStatusList());
wrapper.orderByDesc(User::getAuditTime);
return this.baseMapper.selectList(wrapper);
}
总结
完毕!