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

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

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

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

  1. SELECT
  2. ent_EnterpriseArchives.id entId,
  3. ent_EnterpriseArchives.entName entName,
  4. veh_Vehicle.id vehId,
  5. veh_Vehicle.licPlate vehPlate
  6. from ent_EnterpriseArchives
  7. JOIN veh_Vehicle
  8. on ent_EnterpriseArchives.id = veh_Vehicle.companyId
  9.  
  10. and (
  11. ent_EnterpriseArchives.entName like '%杭州%' or veh_Vehicle.licPlate like '%杭州%'
  12. )
  13. ORDER BY ent_EnterpriseArchives.id

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

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

  1. public ResponseList enterpriseVehicleTree(String paramName, HttpSession session) {
  2. ResponseList response = new ResponseList();
  3. List<Map<String,List<VehVehicleVO>>> resultList = new ArrayList<Map<String,List<VehVehicleVO>>>();
  4.  
  5. if(paramName == null) {
  6. paramName = ConstantUtil.EMPTYSTRING;
  7. }
  8. try {
  9. List<EnterpriseVehicleTreeVO> tempRes = baseMapper.enterpriseVehicleTree(paramName);//上述sql的查询结果
  10. if(tempRes == null || tempRes.size() < ConstantUtil.INTNUM1) {
  11. return response;
  12. }
  13. Integer tempEntId = null;
  14. Map<String,List<VehVehicleVO>> tempMap = new HashMap<String, List<VehVehicleVO>>();
  15. List<VehVehicleVO> tempListStr = new ArrayList<VehVehicleVO>();
  16. for (int i = 0 ; i < tempRes.size(); i++) {
  17. EnterpriseVehicleTreeVO enterpriseVehicleTreeVO = tempRes.get(i);
  18. if(i == ConstantUtil.INTNUM0) {
  19. //第一家公司
  20. tempEntId = enterpriseVehicleTreeVO.getEntId();
  21.  
  22. tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
  23.  
  24. tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
  25. if((i+1) == tempRes.size()) {
  26. resultList.add(tempMap);
  27. break;
  28. }
  29. }else {
  30. //还是同一家公司
  31. if(tempEntId == enterpriseVehicleTreeVO.getEntId()) {
  32. tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
  33. tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
  34. if((i+1) == tempRes.size()) {
  35. resultList.add(tempMap);
  36. }
  37. }else {
  38. //新的公司,先处理上一个公司的数据
  39. resultList.add(tempMap);
  40. tempMap = null;    //注意,这个地方不可以直接调用clear方法去清空,必须重新创建tempMap对象,否则后面的新数据就把之前已经存到list中的上个公司的数据给覆盖掉了
  41. tempMap = new HashMap<String, List<VehVehicleVO>>();
  42. tempListStr = null; //原因同上
  43. tempListStr = new ArrayList<VehVehicleVO>();
  44. tempEntId = enterpriseVehicleTreeVO.getEntId();
  45. tempListStr.add( new VehVehicleVO(enterpriseVehicleTreeVO.getVehId(),enterpriseVehicleTreeVO.getVehLicplate()));
  46. tempMap.put(enterpriseVehicleTreeVO.getEntName(), tempListStr);
  47. if((i+1) == tempRes.size()) {
  48. resultList.add(tempMap);
  49. }
  50. }
  51. }
  52. }
  53. response.setObj(resultList);
  54. } catch (Exception e) {
  55. log.info("xxxxxxxxxxxxxxxxxxxxxx异常,==>e.getMessage:" + e.getMessage() + ",==>e.getStackTrace():" + e.getStackTrace()+ ",==>e:" + e);
  56. response.setSuccess(false).setMsg("xxxxxxxxxxxxxxxxxxxxxxxxx异常");
  57. }
  58. return response;
  59. }

最终效果:

  1. {
  2. "success": true,
  3. "msg": "",
  4. "obj": [
  5. {
  6. "杭州科大讯飞": [
  7. {
  8. "id": 13,
  9. "licPlate": "豫QA3586"
  10. },
  11. {
  12. "id": 14,
  13. "licPlate": "豫QA3585"
  14. },
  15. {
  16. "id": 12,
  17. "licPlate": "豫QA3587"
  18. }
  19. ]
  20. },
  21. {
  22. "杭州网易": [
  23. {
  24. "id": 8,
  25. "licPlate": "浙A36W52"
  26. }
  27. ]
  28. }
  29. ]
  30. }

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. PHP7 - MongoDB Driver 使用心得

    php7 只能使用Mongodb driver来驱动mongodb. 使用Mongodb Driver连接数据库 刚开始使用Mongodb Driver的时候我是拒绝的.查看官方文档只看到一排的类和不 ...

  2. 【Es】jest操作elasticsearch

    https://blog.csdn.net/niuchenliang524/article/details/82869319 操作es的客房端有多个,在此例出三种(具体区别自行百度),本文讲的是jes ...

  3. Flink学习笔记:Operators之Process Function

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  4. VUE学习(三)语法

    模板语法 Mustache 语法 1.插值 <span v-once>这个将不会改变: {{ msg }}</span> v-once,一次性,否则就会绑定 {{    }}  ...

  5. 单据头->实体服务规则中根据单据类型设置可见性或必录等

  6. PHP常用人工智能库

    1.NLPTools(http://php-nlp-tools.com/)NLPTools是一个PHP自然语言处理库.能进行文本分级,聚类等操作.2.Prediction Builder(https: ...

  7. mysql 面试题

    1.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?   2.Mysql的技术特 ...

  8. centos下 KeyboardInterrupt 退不出来的结局方法

  9. C++_代码重用4-多重继承

    继承使用时要注意,默认是私有派生.所以要公有派生时必须记得加关键字Public. MI(Multi Inheritance)会带来哪些问题?以及如何解决它们? 两个主要问题: 从两个不同的基类继承同名 ...

  10. [转] CSS 选择器参考手册

    [From] http://www.w3school.com.cn/cssref/css_selectors.asp CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. ...