企业表 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

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"
        }
      ]
    }
  ]
}

sql查询结果多对多转为一对多返回前端的更多相关文章

  1. Servlet 中利用阿里云包fastjson-1.2.43.jar把map转为Json并返回前端

    1.引入fastjson-1.2.43.jar 包到lib下面,下载地址链接: https://pan.baidu.com/s/1EgAOikoG4VJRJrnUw83SNA  密码: n2fr im ...

  2. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  3. Hibernate关联映射(单项多对一和一对多、双向一对多)

    最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...

  4. 一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...

  5. SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询

    上一篇介绍了入门基础篇SpringDataJPA访问数据库.本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询.部分字段映射.分页等.本文尽量以简单的建模与代码进行展 ...

  6. mybatis:开发环境搭建--增删改查--多表联合查询(多对一)

    什么是mybatisMyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或 ...

  7. MyBatis 高级查询之多对多查询(十一)

    高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...

  8. MyBatis学习05(多对一和一对多)

    8.多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` IN ...

  9. Mybatis 多对一和一对多 学习总结04

    1.Mybatis 组件的声明周期 ​ 声明周期是组件的重要问题,Mybatis也常用语多线程环境,错误使用会造成多线程并发问题,为正确编写Mybatis应用程序,我们要掌握Mybatis组件的声明周 ...

随机推荐

  1. DRF的认证、权限 和 限制

    一.概述 认证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不能访问某个接 ...

  2. 谈谈php中抽象类和接口的区别

    php中抽象类和接口的区别 1) 概念 面向对象的三大概念:封装,继承,多态 把属性和方法封装起来就是类.        一个类的属性和方法被另外的类复制就是继承,PHP里面的任何类都可以被继承,被继 ...

  3. pytest的一些你爱不释手的插件

    1. pytest-html 安装: pip install pytest-html # 通过pip安装pytest-html 运行测试文件的时候,命令行加上对应参数即可 比如:pytest test ...

  4. 查看 tensorflow 是GPU版本 还是CPU版本

    在Python环境中输入: import os from tensorflow.python.client import device_lib os.environ["TF_CPP_MIN_ ...

  5. PHP中使用CURL之php curl详细解析和常见大坑

    这篇文章主要介绍了PHP中使用CURL之php curl详细解析和常见大坑 ,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 七夕啦,作为开发,妹子没得撩就“撩”下服务器吧,妹子有得撩的同学 ...

  6. sqlalchemy orm数据类型验证方法比较

    1.在定义ORM模型时校验 sqlalchemy提供validates函数支持对字段的校验 from sqlalchemy.orm import validates class EmailAddres ...

  7. Qt 学习之路 2(41):model/view 架构

    Qt 学习之路 2(41):model/view 架构 豆子 2013年1月23日 Qt 学习之路 2 50条评论 有时,我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应 ...

  8. Xilinx FPGA使用——ROM初始化文件

    在调用ROM的IP Core时,需要对其进行初始化,利用MATLAB生成其初始化数据文件. 工具:ISE 14.7.MATLAB.notepad++ 废话不多说,直接上MATLAB代码,生成了一个10 ...

  9. pip 使用代理

    pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-python 红色部分 代表使用 阿里云 代理 安装 pip

  10. 【算法笔记】B1035 插入与归并

    1035 插入与归并 (25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直 ...