Spring Boot + Mybats-Plus处理企业实际业务中排序的问题

目录

前言

1. 需求

2. controller

3. Service(错误的例子)

4. Service

方式一:用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);
    
}

总结

完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值