上次我们提到,不使用left-loin关联查询,可能是为了提高效率或者配置缓存,也可以简化一下sql语句的编写。只写单表查询,sql真得太简单了。问题是,查询多个表的数据还是非常需要的。 因此,存在这么一个强烈的需求:查询2个集合,怎么合并2个集合中的数据为1个集合,且数据关联要正确。在实践中,我提炼了如下流程和工具方法: 流程 先查询第1个集合,根据第1个集合的结果,查询第2个集合,合并2个集合 public PageVo listPage(PageVo form) { List> list = transferDao.listPage(form); if (list != null && list.size()>0) { List> 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> mainList, List> relationList, String relationKey, String prefix) ;
// 合并2个集合,先查找关联map,再合并2个单独的map,合并map的key加上前缀,2个map中的关联key是2个 public static void merge(List> mainList, String mainKey, List> relationList, String relationKey, String prefix) ;
// 合并2个集合,先查找关联map,再合并2个单独的map,2个map中的关联key是同1个 public static void merge(List> mainList, List> relationList, String relationKey) ;
// 合并2个集合,2个集合中的map通过key关联 public static void merge(List> mainList, String mainKey, List> relationList, String relationKey) ;
// ////////////合并2个Map,前缀prefix可要可不要,不要的情况下,key重名时,会覆盖/////////////////////
// 合并2个map,relation中的会放到main总,key都加上prefix public static void merge(Map mainMap, Map relation, String prefix) ;
// 合并2个map,如果存在重复,relationMap会覆盖main中的 public static void merge(Map mainMap, Map relationMap) ;
// ///////////////////////寻找一个Map在一个集合中的关联Map///////////////////// /** * 从一个集合中找到目标对象,如果没有找到,返回null * * @param 2个map共同的key */ public static Map relationMap(Map mainMap, List> list, String relationKey) ;
// 找到1个map在集合list中需要关联的对象,分别指定各自的key public static Map relationMap(Map mainMap, String mainKey, List> list, String relationKey) ; 工具方法的源码就不提供了,JavaWeb开发的流程和基础库还在持续积累中。