mybatise一對多關係查詢時不能直接分頁
阿新 • • 發佈:2018-11-27
在mybatise應用時候我們經常會用到collection進行一對多對映,這時候分頁就有了問題。
比如A表1條記錄對應B表3條記錄,這時候查詢就是3條記錄,但是實際上我們需要的只是1條。
解決方案:
一 提供一個工具方法生成新的RowBounds
核心思想:
1 計算主表對應副表的記錄數List counts
2 計算頁面大小pageSize,等於原pageSize+counts集合裡面每個值的累加
3 設定偏移量
/**
* mybatise一對多關係查詢時不能直接分頁,可以用此方法獲取RowBounds物件。<br/>
* 建議counts的記錄數在1000以下,如果大過1000可以採取for迴圈裡面查詢子表的方案
* @param counts 分組查詢的記錄集合
* @param pageBean 分頁物件
* @return
*/
public static RowBounds getGroupRowBounds(List<Integer> counts, PageBean pageBean){
int offset = PageUtil.setParameter((int) counts.size(),pageBean);
int pageSize = 0;
for(int i = 1;i <= counts.size();i++){
//每一條主記錄對應的副表記錄(多)
int count = counts.get(i-1);
pageSize = pageSize+count;
if (offset == i){
//設定起始值
offset = pageSize;
}
}
return new RowBounds(offset,pageSize);
}
PageBean 是一個分頁物件,網上類似程式碼很多,此處不貼出來
生成counts的參考sql寫法
SELECT
count(*)
FROM (
SELECT
t.uuid
FROM
t_om_advice_feedback t
LEFT JOIN t_om_feedback_module_relation r
ON t.uuid = r.feedback_id and r.module_id <![CDATA[ <> ]]> 0
LEFT JOIN t_om_advice_feedback_module t2
ON r.module_id = t2.uuid and r.module_id <![CDATA[ <> ]]> 0
LEFT JOIN t_om_advice_feedback_reply t3
ON t.uuid = t3.feedback_id
LEFT JOIN om_track_user u
ON t3.reply_dd = u.dd
LEFT JOIN t_om_advice_feedback_img t4
ON t.uuid = t4.feedback_id
WHERE t.feedback_dd = #{feedBackDd}
)t
group by t.uuid
其實就是對原來計算總數的count(*)的sql進行分組,得到一對多列表集合
主表主鍵 | 一對多關聯條數 |
---|---|
1 | 3 |
2 | 4 |
3 | 5 |
二 就是不採用collection對映
查詢語句改為只查詢主表,然後在for迴圈中通過主表id將關聯的副表資料查詢出來。這種方法程式設計上比較麻煩,資料庫查詢次數較多,適合大量資料的時候。建議是在加上業務條件後的count(*)語句查詢結果集在1000條以上時使用,因為對大資料量進行分組效能沒有拆分多個小資料sql快,具體可以explain檢視。
此處不張貼程式碼