1. 程式人生 > >不使用left-join等多表關聯查詢,只用單表查詢和Java程式,簡便實現“多表查詢”效果

不使用left-join等多表關聯查詢,只用單表查詢和Java程式,簡便實現“多表查詢”效果

上次我們提到,不使用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 [email protected] 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開發的流程和基礎庫還在持續積累中。