sql查询结果多对多转为一对多返回前端

企业表 ent_EnterpriseArchives  有id,企业名称 entName

veh_Vehicle 车辆表,有所属企业id  companyId,车辆id,车牌号licPlate

目的是查询企业和车辆的树状结果。如下图,然后返回前端。

 

执行如下sql得到的结果是:【根据车牌号或者企业名称模糊查询】

SELECT
    ent_EnterpriseArchives.id entId,
    ent_EnterpriseArchives.entName entName,
    veh_Vehicle.id vehId,
    veh_Vehicle.licPlate vehPlate
from ent_EnterpriseArchives  
JOIN veh_Vehicle 
on  ent_EnterpriseArchives.id = veh_Vehicle.companyId
where ent_EnterpriseArchives.`status` = 1
and veh_Vehicle.`status` = 1
and (
  ent_EnterpriseArchives.entName like '%杭州%' or veh_Vehicle.licPlate like '%杭州%'
)
ORDER BY ent_EnterpriseArchives.id

【上述数据结果为造的假数据】

所以要对这个sql的查询结果进行去重公司名称,返回前端树状结果。下面的代码即为处理过程:

public ResponseList enterpriseVehicleTree(String paramName, HttpSession session) {
        ResponseList response = new ResponseList();
        List<Map<String,List<VehVehicleVO>>> resultList = new ArrayList<Map<String,List<VehVehicleVO>>>();
        
        if(paramName == null) {
            paramName = ConstantUtil.EMPTYSTRING;
        }
        try {
            List<EnterpriseVehicleTreeVO> tempRes = baseMapper.enterpriseVehicleTree(paramName);//上述sql的查询结果
            if(tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
                return response;
            }
            Integer tempEntId = null;
            Map<String,List<VehVehicleVO>> tempMap = new HashMap<String, List<VehVehicleVO>>();
            List<VehVehicleVO> tempListStr = new ArrayList<VehVehicleVO>();
            for (int i = 0 ; i < tempRes.size(); i++) {
                EnterpriseVehicleTreeVO enterpriseVehicleTreeVO = tempRes.get(i);
                if(i == ConstantUtil.INTNUM0) {
                    //第一家公司
                    tempEntId = enterpriseVehicleTreeVO.getEntId();
                    
                    tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
                    
                    tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
                    if((i+1) == tempRes.size()) {
                        resultList.add(tempMap);
                        break;
                    }
                }else {
                    //还是同一家公司
                    if(tempEntId == enterpriseVehicleTreeVO.getEntId()) {
                        tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
                        tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
                        if((i+1) == tempRes.size()) {
                            resultList.add(tempMap);
                        }
                    }else {
                        //新的公司,先处理上一个公司的数据
                        resultList.add(tempMap);
                        tempMap = null;    //注意,这个地方不可以直接调用clear方法去清空,必须重新创建tempMap对象,否则后面的新数据就把之前已经存到list中的上个公司的数据给覆盖掉了
                        tempMap = new HashMap<String, List<VehVehicleVO>>();
                        tempListStr = null;   //原因同上
                        tempListStr = new ArrayList<VehVehicleVO>();
                        tempEntId = enterpriseVehicleTreeVO.getEntId();
                        tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
                        tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
                        if((i+1) == tempRes.size()) {
                            resultList.add(tempMap);
                        }
                    }
                }
            }
            response.setObj(resultList);
        } catch (Exception e) {
            log.info("xxxxxxxxxxxxxxxxxxxxxx异常,==>e.getMessage:" + e.getMessage() + ",==>e.getStackTrace():" + e.getStackTrace()+ ",==>e:" + e);
            response.setSuccess(false).setMsg("xxxxxxxxxxxxxxxxxxxxxxxxx异常");
        }
        return response;
    }

 最终效果:

{
  "success": true,
  "msg": "",
  "obj": [
    {
      "杭州科大讯飞": [
        {
          "id": 13,
          "licPlate": "豫QA3586"
        },
        {
          "id": 14,
          "licPlate": "豫QA3585"
        },
        {
          "id": 12,
          "licPlate": "豫QA3587"
        }
      ]
    },
    {
      "杭州网易": [
        {
          "id": 8,
          "licPlate": "浙A36W52"
        }
      ]
    }
  ]
}

20190901, 今天整理博客,看到这篇文章,有必要进行补充说明:

其实对于这种需求,最好的方式是进行lambda表达式的使用。在项目中另外一处依旧有类似上述的需求,而且层级更深一层。企业、车牌号、设备号【每个车辆上有多个设备】,需求同上,依旧返回树形结构数据。我当时依然采用了上述方式。上述例子只有两层,实现起来的复杂度勉强能理解接受,下面的例子,自己都要写晕了,后来出现一个bug【计数器没加1】,自己排查都要痛苦死,逻辑太复杂了。经同事指导,决定重构,采用lambda表达式分组,实现起来代码逻辑大大简化。下面贴上代码,注释部分为改造前的旧方法。

代码中设计大量的封装实体类,可能不太好理解,其实只看每一层级分组的那部分代码即可,其它无非都是业务属性封装。

/**
 * @since 2019-05-06
 */
@Service
@Slf4j
public class VehVideomonitorOnlineServiceImpl extends ServiceImpl<VehVideomonitorOnlineMapper, VehVideomonitorOnline> implements IVehVideomonitorOnlineService {

    
    /**
     * @author       
     * @createTime  2019年5月6日上午11:00:40
     * @description 视频监控
     * @param    
     * @return    
     */
    @Override
    public ResponseList vedioMonitor(String paramName,AreaCodeParamDTO areaCodeHandleRes) {
        ResponseList response = new ResponseList();
        if (paramName == null) {
            paramName = ConstantUtil.EMPTYSTRING;
        }
        
        try {
            List<VedioMonitorVO> resultList = new ArrayList<VedioMonitorVO>();               //结果集合
            
            List<VehVideoMonitorOnlineVO> tempRes = baseMapper.vedioMonitor(paramName,areaCodeHandleRes.getProvinceCode(),areaCodeHandleRes.getAreaCityCode(),areaCodeHandleRes.getAreaCode());
            if (tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
                return response;
            }
            
            //按照企业id进行分组 
            Map<Integer, List<VehVideoMonitorOnlineVO>> collectMapEnt = tempRes.stream().collect(Collectors.groupingBy(VehVideoMonitorOnlineVO::getEntId)); 
            for (Map.Entry<Integer, List<VehVideoMonitorOnlineVO>> entry : collectMapEnt.entrySet()) {
                
                Integer entId = entry.getKey();//企业id
                List<VehVideoMonitorOnlineVO> groupByEntIdList = entry.getValue();//按照企业id分组后的每组数据
                
                VedioMonitorVO entVo = new VedioMonitorVO();//结果对象实体  一级
                entVo.setEntId(entId);
                String entName = "";
                List<MiddleVedioMonitorVO> middleList = new ArrayList<MiddleVedioMonitorVO>(); //【车辆信息】集合
                
                if (groupByEntIdList != null && groupByEntIdList.size() > 0) {
                    
                    //按照车辆id进行分组 
                    Map<Integer, List<VehVideoMonitorOnlineVO>> collectMapVehicle = groupByEntIdList.stream().collect(Collectors.groupingBy(VehVideoMonitorOnlineVO::getVehicleId)); 
                    for (Map.Entry<Integer, List<VehVideoMonitorOnlineVO>> entryMid : collectMapVehicle.entrySet()) {
                        
                        Integer vehicleId = entryMid.getKey();//车辆id
                        List<VehVideoMonitorOnlineVO> groupByVehicleIdList = entryMid.getValue();//按照车辆id分组后的每组数据
                        
                        MiddleVedioMonitorVO vehVo = new MiddleVedioMonitorVO();//车辆对象实体   二级
                        vehVo.setVehicleId(vehicleId);
                        String licPlate = "";
                        List<VehVideomonitorOnline> lastList = new ArrayList<VehVideomonitorOnline>();//设备信息集合
                        
                        if (groupByVehicleIdList != null && groupByVehicleIdList.size() > 0) {
                            
                            for (VehVideoMonitorOnlineVO obj : groupByVehicleIdList) {
                                VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline();//设备对象实体  三级
                                vehVideomonitorOnline.setDevId(obj.getDevId());
                                vehVideomonitorOnline.setVideoUrl(obj.getVideoUrl());
                                vehVideomonitorOnline.setStatus(obj.getStatus());
                                vehVideomonitorOnline.setUrl(obj.getUrl());
                                vehVideomonitorOnline.setDevice(obj.getDevice());
                                vehVideomonitorOnline.setMfg(obj.getMfg());
                                vehVideomonitorOnline.setVehicleId(vehicleId);
                                lastList.add(vehVideomonitorOnline);
                                
                                licPlate = obj.getLicPlate();
                                entName = obj.getEntName();
                            }
                        }
                        vehVo.setLicPlate(licPlate);
                        vehVo.setVehVideomonitorOnlineList(lastList);
                        middleList.add(vehVo);
                    }
                }
                
                entVo.setEntName(entName);
                entVo.setMiddleList(middleList);
                resultList.add(entVo);
            }
            response.setObj(resultList);
        } catch (Exception e) {
            log.info("视频监控信息查询异常,==>e:",e);
            response.setSuccess(false).setMsg("视频监控信息查询异常");
        }
        return response;
        
    }
    
//    /**
//     * @author        
//     * @createTime  2019年5月6日上午11:00:40
//     * @description 视频监控
//     * @param    
//     * @return    
//     */
//    @Override
//    public ResponseList vedioMonitor(String paramName,AreaCodeParamDTO areaCodeHandleRes) {
//        ResponseList response = new ResponseList();
//        if (paramName == null) {
//            paramName = ConstantUtil.EMPTYSTRING;
//        }
//        try {
//            List<VehVideoMonitorOnlineVO> tempRes = baseMapper.vedioMonitor(paramName,areaCodeHandleRes.getProvinceCode(),areaCodeHandleRes.getAreaCityCode(),areaCodeHandleRes.getAreaCode());
//            if (tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
//                return response;
//            }
//            
//            int tempEntId = 0;//企业id临时变量
//            int tempVehId = 0;//车辆id临时变量
//            int vehNumber = 0;
//            int entNumber = 0;
//            
//            
//            MiddleVedioMonitorVO middleVedioMonitorVO = null;
//            VedioMonitorVO vedioMonitorVO = null;
//            List<VedioMonitorVO> resultList = new ArrayList<VedioMonitorVO>();
//            List<MiddleVedioMonitorVO> middleList = new ArrayList<MiddleVedioMonitorVO>(); //【车辆信息】集合
//            List<VehVideomonitorOnline> lastList  = new ArrayList<VehVideomonitorOnline>();//【设备信息】集合
//            for (int i = 0; i < tempRes.size(); i++) {
//                VehVideoMonitorOnlineVO vehVideoMonitorOnlineVO = tempRes.get(i);
//                if(i == ConstantUtil.INTNUM0) {
//                    //第一家公司
//                    tempEntId = vehVideoMonitorOnlineVO.getEntId();            //企业id给临时变量
//                    tempVehId = vehVideoMonitorOnlineVO.getVehicleId();     //车辆id给临时变量
//                    
//                    //【设备信息】
//                    VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline(vehVideoMonitorOnlineVO.getDevId(),vehVideoMonitorOnlineVO.getDevice(),vehVideoMonitorOnlineVO.getVideoUrl(),vehVideoMonitorOnlineVO.getStatus());
//                    lastList.add(vehVideomonitorOnline);
//                    
//                    //【车辆信息】
//                    middleVedioMonitorVO = new MiddleVedioMonitorVO(vehVideoMonitorOnlineVO.getVehicleId(),vehVideoMonitorOnlineVO.getLicPlate(),lastList);
//                    middleList.add(middleVedioMonitorVO);
//                    
//                    //【结果信息】
//                    vedioMonitorVO = new VedioMonitorVO(vehVideoMonitorOnlineVO.getEntId(),vehVideoMonitorOnlineVO.getEntName(),middleList);
//                    resultList.add(vedioMonitorVO);
//                    
//                }else {
//                    //还是同一家公司
//                    if(tempEntId == vehVideoMonitorOnlineVO.getEntId()) {
//                        VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline(vehVideoMonitorOnlineVO.getDevId(),vehVideoMonitorOnlineVO.getDevice(),vehVideoMonitorOnlineVO.getVideoUrl(),vehVideoMonitorOnlineVO.getStatus());
//                        //还是同一辆车
//                        if(tempVehId == vehVideoMonitorOnlineVO.getVehicleId()) {
//                            lastList.add(vehVideomonitorOnline);
//                            middleVedioMonitorVO.setVehVideomonitorOnlineList(lastList);
//                            if(vehNumber == 0) {
//                                //还是第一辆车
//                                middleList.clear();
//                                middleList.add(middleVedioMonitorVO);
//                                vedioMonitorVO.setMiddleList(middleList);
//                                resultList.clear();
//                                resultList.add(vedioMonitorVO);
//                            }else {
//                                //Iterator it = middleList.iterator();
//                                middleList.remove(vehNumber);
//                                middleList.add(middleVedioMonitorVO);
//                                vedioMonitorVO.setMiddleList(middleList);
//                                judgeResultListFunction(entNumber,resultList,vedioMonitorVO);
//                            }
//                        }else {
//                            //同一家公司的另一辆车
//                            vehNumber++;
//                            tempVehId = vehVideoMonitorOnlineVO.getVehicleId();
//                            lastList = null;
//                            lastList  = new ArrayList<VehVideomonitorOnline>();
//                            lastList.add(vehVideomonitorOnline);
//                            middleVedioMonitorVO = null;
//                            middleVedioMonitorVO = new MiddleVedioMonitorVO(vehVideoMonitorOnlineVO.getVehicleId(),vehVideoMonitorOnlineVO.getLicPlate(),lastList);
//                            middleList.add(middleVedioMonitorVO);
//                            vedioMonitorVO.setMiddleList(middleList);
//                            judgeResultListFunction(entNumber,resultList,vedioMonitorVO);
//                        }
//                    }else {
//                        //新的公司
//                        entNumber++;
//                        vehNumber = 0;
//                        tempEntId = vehVideoMonitorOnlineVO.getEntId();
//                        tempVehId = vehVideoMonitorOnlineVO.getVehicleId();
//                        VehVideomonitorOnline vehVideomonitorOnline = new VehVideomonitorOnline(vehVideoMonitorOnlineVO.getDevId(),vehVideoMonitorOnlineVO.getDevice(),vehVideoMonitorOnlineVO.getVideoUrl(),vehVideoMonitorOnlineVO.getStatus());
//                        lastList = null;
//                        lastList  = new ArrayList<VehVideomonitorOnline>();
//                        lastList.add(vehVideomonitorOnline);
//                        middleVedioMonitorVO = new MiddleVedioMonitorVO(vehVideoMonitorOnlineVO.getVehicleId(),vehVideoMonitorOnlineVO.getLicPlate(),lastList);
//                        middleList = null;
//                        middleList = new ArrayList<MiddleVedioMonitorVO>();
//                        middleList.add(middleVedioMonitorVO);
//                        vedioMonitorVO = new VedioMonitorVO(vehVideoMonitorOnlineVO.getEntId(),vehVideoMonitorOnlineVO.getEntName(),middleList);
//                        resultList.add(vedioMonitorVO);
//                    }
//                }
//            }
//            
//            response.setObj(resultList);
//        } catch (Exception e) {
//            log.info("视频监控信息查询异常,==>e:",e);
//            response.setSuccess(false).setMsg("视频监控信息查询异常");
//        }
//        return response;
//        
//    }
//    
    
    public void judgeResultListFunction( int entNumber,List<VedioMonitorVO> resultList, VedioMonitorVO vedioMonitorVO ) {
        if(entNumber == 0) {
            //还是第一家公司
            resultList.clear();
            resultList.add(vedioMonitorVO);
        }else {
            //新的公司
            resultList.remove(entNumber);
            resultList.add(vedioMonitorVO);
        }
    }

}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值