? ? 我們都知道在實(shí)際的開發(fā)中抬探,我們經(jīng)常遇到需要展示一對(duì)多的數(shù)據(jù)問題,如:一個(gè)人共有n個(gè)訂單帆赢,每個(gè)訂單有不定的商品小压,那么這種顯示的數(shù)據(jù)結(jié)構(gòu)就是我們的一對(duì)多數(shù)據(jù)結(jié)構(gòu):如下所示
? ? 應(yīng)為訂單的數(shù)據(jù)量大的問題,我們要采取分頁(yè)椰于,但是mybatis的一對(duì)多collection的分頁(yè)插件pagehelper的計(jì)算結(jié)果是錯(cuò)誤的怠益,錯(cuò)誤原因在于,一對(duì)多collection瘾婿,他計(jì)算的條數(shù)是按商品計(jì)算的(一對(duì)多的“多”蜻牢,而不是“一”),比如上圖中憋他,如果分頁(yè)參數(shù)是pageNum=1,pageSize=2,那么我們想要的結(jié)果應(yīng)該是上圖所示孩饼,但我們實(shí)際查詢出來的是,只有orderNo為1的那一部分竹挡。
? ? ? 如果采用collection的子查詢select來實(shí)現(xiàn)镀娶,那么分頁(yè)的問題是能解決了,但是其對(duì)查詢條件的支持很不友好揪罕,如果查詢條件的參數(shù)是訂單信息梯码,還可以支持,但是查詢條件一旦關(guān)聯(lián)到子查詢好啰,那么就實(shí)現(xiàn)gg了轩娶。
? ? 所以我們只能自己實(shí)現(xiàn)分頁(yè)插件,思路是:
一框往,按條件統(tǒng)計(jì)所有符合條件的訂單數(shù)量鳄抒,結(jié)果作為分頁(yè)結(jié)果的總條數(shù),sql語(yǔ)句為:select (distinct orderNo) from order_info left join order_goods_info..........where condition條件
二. 按條件查詢每個(gè)訂單的商品數(shù)量(分組統(tǒng)計(jì)),結(jié)果是一個(gè)integer的集合许溅,sql語(yǔ)句為select count(orderNo) from order_info left join order_goods_info...... where condition條件 group by order_info.orderNo
三.若分頁(yè)參數(shù)是pageNum(頁(yè)碼)瓤鼻,pageSize(頁(yè)容量),重新計(jì)算分頁(yè)查詢sql的limit參數(shù)skipNumber,pageSize
四.對(duì)步驟二返回的集合進(jìn)行截取求和贤重,計(jì)算pageNum頁(yè)之前所有的記錄條數(shù)skipNumber茬祷,結(jié)果作為,代碼為:int skipNumber = list.subList(0, (pageNum -1) * pageSize>list.size()?list.size():(pageNum -1) * pageSize).stream().mapToInt(Integer::intValue).sum();(想想為什么會(huì)有三元表達(dá)式)
五.計(jì)算pageSize:int pageSize= list.subList((pageNum -1) * pageSize, pageNum *pageSize>list.size()?list.size():pageNum*pageSize).stream().mapToInt(Integer::intValue).sum();
六.執(zhí)行sql查詢并蝗,編寫一對(duì)多collection 的mybatis映射
select 顯示元素.......from order_info left join order_goods_info .......where condition 條件 limit skipNumber,pageSize
部分代碼如下:
修改:其中condition.setTotal計(jì)算錯(cuò)誤祭犯,正確的應(yīng)該是carClassCount.size()
方案實(shí)現(xiàn)目標(biāo):一對(duì)多collection 查詢,可分頁(yè)滚停,查詢條件完美支持
缺點(diǎn):查詢次數(shù)增加一次(分組統(tǒng)計(jì))
注意:最后返回的分頁(yè)結(jié)果看起來?xiàng)l數(shù)不正常沃粗,那是你的參考對(duì)象錯(cuò)誤,真正的條數(shù)為一對(duì)多的“一”條數(shù)铐刘,而不是“多”的條數(shù)陪每,也就是訂單條數(shù)是真的影晓。