上次我们提到,不使用left-loin关联查询,可能是为了提高效率或者配置缓存,也可以简化一下sql语句的编写。只写单表查询,sql真得太简单了。问题是,查询多个表的数据还是非常需要的。

因此,存在这么一个强烈的需求:查询2个集合,怎么合并2个集合中的数据为1个集合,且数据关联要正确。在实践中,我提炼了如下流程和工具方法:

流程
  先查询第1个集合,根据第1个集合的结果,查询第2个集合,合并2个集合
 public PageVo listPage(PageVo form) {
 List<Map<String, Object>> list = transferDao.listPage(form);
 if (list != null && list.size()>0) {
  List<Map<String, Object>> loanList = loanInfoService.batchList(list);
  MergeUtilmerge(list, loanList);
  form.setList(list);
 }
 return form;
}

合并集合的工具方法
/**
* 合并关联数据集合到主表集合中,把2个集合中的数据合并到一个集合中,通过某个key关联,从而替代数据库的left-join等关联查询。

* 方法分3类:合并2个元素为Map的集合、合并2个Map、查找1个Map在另外一个元素为集合的关联Map。

* 可选参数:2个map的关联key可能是1个,也可能是2个;合并2个Map时,可以为关联Map的key分别加上前缀prefix,防止重名,也可以不加上。

* 不适用场景:多表查询搜索且查询条件在关联表中且需要分页的时候,只使用单表查询+Merge工具,是不够的。
* @author fansunion@qq.com 2014年11月26日
*/
public class MergeUtil {
// ///////////////////////合并2个集合中的所有Map/////////////////////

/**
 * 合并关联数据集合到主表结合中,把2个集合中的数据合并到一个集合中,通过某个主键关联(不用数据库left join)
 */
// 合并2个集合,先查找关联map,再合并2个单独的map,2个map中的关联key是同一个
public static void merge(List<Map<String, Object>> mainList,
  List<Map<String, Object>> relationList, String relationKey,
  String prefix) ;

// 合并2个集合,先查找关联map,再合并2个单独的map,合并map的key加上前缀,2个map中的关联key是2个
public static void merge(List<Map<String, Object>> mainList,
  String mainKey, List<Map<String, Object>> relationList,
  String relationKey, String prefix) ;

// 合并2个集合,先查找关联map,再合并2个单独的map,2个map中的关联key是同1个
public static void merge(List<Map<String, Object>> mainList,
  List<Map<String, Object>> relationList, String relationKey) ;

// 合并2个集合,2个集合中的map通过key关联
public static void merge(List<Map<String, Object>> mainList,
  String mainKey, List<Map<String, Object>> relationList,
  String relationKey) ;

// ////////////合并2个Map,前缀prefix可要可不要,不要的情况下,key重名时,会覆盖/////////////////////

// 合并2个map,relation中的会放到main总,key都加上prefix
public static void merge(Map<String, Object> mainMap,
  Map<String, Object> relation, String prefix) ;

// 合并2个map,如果存在重复,relationMap会覆盖main中的
public static void merge(Map<String, Object> mainMap,
  Map<String, Object> relationMap) ;

// ///////////////////////寻找一个Map在一个集合中的关联Map/////////////////////
/**
 * 从一个集合中找到目标对象,如果没有找到,返回null
 * 
 * @param 2个map共同的key
 */
public static Map<String, Object> relationMap(Map<String, Object> mainMap,
  List<Map<String, Object>> list, String relationKey) ;

// 找到1个map在集合list中需要关联的对象,分别指定各自的key
public static Map<String, Object> relationMap(Map<String, Object> mainMap,
  String mainKey, List<Map<String, Object>> list, String relationKey) ;

工具方法的源码就不提供了,Java Web开发的流程和基础库还在持续积累中。

原文首发:http://fansunion.cn/article/detail/540.html

不使用left-join等多表关联查询,只用单表查询和Java程序,简便实现“多表查询”效果的更多相关文章

  1. java程序获得SqlServer数据表的表结构

    /**   * 取得一张表的结构信息   * 使用DatabaseMetaData与ResultSetMetaData结合的方式获取全部属性   * @param conn   数据连接   * @p ...

  2. SQL语句分组排序,多表关联排序

    SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...

  3. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

  4. MapRedece(多表关联)

    多表关联: 准备数据 ******************************************** 工厂表: Factory Addressed BeijingRedStar 1 Shen ...

  5. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  6. Oracle数据库,join多表关联方式、union结果集合并

    join on :   多表关联 内连接 :与其他表连接 from 表1 t join 表2 s on t.字段1 =s.字段2 join 表3 n on n.字段3=t.字段1 或 from 表1 ...

  7. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  8. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  9. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  10. [NewLife.XCode]扩展属性(替代多表关联Join提升性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

随机推荐

  1. Windows平台上的pip安装

    写在前面 pip 是 Python 的包管理工具,在 Python 开发中必不可少.作为一名python菜鸟,本文在踩坑无数的基础上尽可能详细地解释pip的安装过程.在安装之前需要明确两点: 1.pi ...

  2. 【例题 8-7 UVA - 11572】Unique Snowflakes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 类似尺取法. 用set判断这段区间有没有重复的数字. 有的话,就把头节点的那个数字删掉,直到没有为止. [代码] /* 1.Shou ...

  3. SpringMVC 传递相同名称的参数的最佳方法

    华为云4核8G,高性能云服务器,免费试用 >>>   SpringMVC 多个对象的相同字段参数传递解决方案,在SpringMVC中,有时需要传递多个对象(除了Model和web元素 ...

  4. mysql测试spring事务是否生效

    同时对三张表进行插入操作,事务保证完整性.下面进行简单测试: 1. 锁定表 锁定用户表 LOCK TABLES user WRITE; 查看表是否锁定: show ; 显示被锁定的表. 2. 验证在同 ...

  5. springMVC视图解析器——InternalResourceViewResolver(转)

    springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...

  6. [appium]-9宫格解锁方法

    from appium.webdriver.common.touch_action import TouchAction TouchAction(self.driver).press(x=228,y= ...

  7. windows下配置mycat与常见问题解决

    mycat官网:http://www.mycat.org.cn/ wiki:https://github.com/MyCATApache/Mycat-Server/wiki MyCat使用Mysql的 ...

  8. 洛谷—— P1069 细胞分裂

    https://www.luogu.org/problem/show?pid=1069#sub 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细 ...

  9. 洛谷 P2069 松鼠吃果子

    P2069 松鼠吃果子 题目描述 有N个一种松鼠喜欢吃的果子由下向上串排成一列,并标号1,2,...N.一只松鼠从最下果子开始向上跳,并且第i次跳可以一次跳过i*i*i除以5的余数+1个果子(=i*i ...

  10. (转)oracle表空间使用率统计查询

    转自:http://www.cnblogs.com/xwdreamer/p/3511047.html 参考文献 文献1:http://blog.itpub.net/24104518/viewspace ...