Mybatis-Plus实现多表分页查询

实战场景:

查询每个人员信息(record_user表)含多个打卡记录(record_colok表)。

/**
     * 人员打卡信息分页模糊查询
     * @param page
     * @param pageSize
     * @param list
     * @param userName
     * @param userCode
     * @param userTown
     * @param userVillage
     * @return
     */
    @Override
    public Page<RecordUserDto> pageDto(int page, int pageSize, Integer list, String userName, String userCode, String userTown, String userVillage) {
        //查询人员基本信息
        Page<RecordUser> pageInfo1 = recordMgtService.pageUser(page, pageSize, list, userName, userCode, userTown, userVillage);
        //构造分页构造器
        //人员信息+打卡记录,分页构造器
        Page<RecordUserDto> recordUserDtoPage = new Page<>();
        BeanUtils.copyProperties(pageInfo1, recordUserDtoPage, "records");
        List<RecordUser> records = pageInfo1.getRecords();
        final String year = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy"));//转换为年格式
        final StringJoiner initiateTime = new StringJoiner("-").add(year).add("01").add("01");//拼接"月-日"
        final String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //方式一:遍历集合,循环里操作数据库有风险
        /*List<RecordUserDto> recordUserDtoList = records.stream().map((item) -> {
            RecordUserDto recordUserDto = new RecordUserDto();
            BeanUtils.copyProperties(item, recordUserDto);
            String userCode1 = item.getUserCode();
            LambdaQueryWrapper<RecordClock> queryWrapper = new LambdaQueryWrapper();
            queryWrapper.eq(RecordClock::getUserCode, userCode1)
                    .ge(RecordClock::getClockTime, initiateTime.toString())
                    .le(RecordClock::getClockTime, currentTime)
                    .select(RecordClock::getClockTime);
            List<RecordClock> recordClocks = list(queryWrapper);
            recordUserDto.setRecordClocks(recordClocks);
            return recordUserDto;
        }).collect(Collectors.toList());
        recordUserDtoPage.setRecords(recordUserDtoList);
        return recordUserDtoPage;
    }*/
        //获取身份证号集合
        List<String> userCodeList = records.stream().map((item) -> {
            RecordUserDto recordUserDto = new RecordUserDto();
            BeanUtils.copyProperties(item, recordUserDto);
            String userCode1 = item.getUserCode();
            return userCode1;
        }).collect(Collectors.toList());
        //更据身份证号集合查询打卡信息集合
        LambdaQueryWrapper<RecordClock> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.in(RecordClock::getUserCode,userCodeList)
                .ge(RecordClock::getClockTime, initiateTime.toString())
                .le(RecordClock::getClockTime, currentTime)
                .orderByAsc(RecordClock::getClockTime)
                .select(RecordClock::getClockTime,RecordClock::getUserCode);
        List<RecordClock> recordClockList = list(queryWrapper);
        //分组
        Map<String,List<RecordClock>> collect = recordClockList.stream().collect(Collectors.groupingBy(RecordClock::getUserCode));
        //将数据整合到Dto类
        List<RecordUserDto> recordUserDtoList = records.stream().map((item) -> {
            RecordUserDto recordUserDto = new RecordUserDto();
            BeanUtils.copyProperties(item, recordUserDto);
            List<RecordClock> recordClockList1 = collect.get(item.getUserCode());
            recordUserDto.setRecordClocks(recordClockList1);
            return recordUserDto;
        }).collect(Collectors.toList());
        recordUserDtoPage.setRecords(recordUserDtoList);
        return recordUserDtoPage;
    }

涉及两个知识点:

java8的LocalDate类,日期拼接。

//获取当前日期,转换为年格式
final String year = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy"));
//自定义拼接"月-日"
final StringJoiner initiateTime = new StringJoiner("-").add(year).add("01").add("01");
//时间转化为Sting类型
InitiateTime.toString();

//获取当前日期,转换为"年-月-日"格式
final String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

List集合分组

将List集合根据相同Key(userCode)进行分组,转化为Value为List<RecordClock.>的Map集合

//分组
Map<String,List<RecordClock>> collect = recordClockList.stream().collect(Collectors.groupingBy(RecordClock::getUserCode));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值