溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ibatis resultMap groupBy屬性怎么用

發(fā)布時(shí)間:2021-11-03 13:40:01 來(lái)源:億速云 閱讀:209 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)ibatis resultMap groupBy屬性怎么用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

最近開(kāi)始轉(zhuǎn)用j2ee做開(kāi)發(fā),使用的數(shù)據(jù)持久層是iBatis。

在iBatis中要解決1:N、M:N問(wèn)題必須要使用到ibatis resultMap,但使用過(guò)程中會(huì)遇到一個(gè)問(wèn)題,就是groupBy的不能繼承問(wèn)題?,F(xiàn)在舉個(gè)例子向大家介紹一下這個(gè)問(wèn)題和解決方法。

ibatis resultMap groupBy問(wèn)題描述:

考慮一下這種情況,假如一家公司為了員工福利決定搞業(yè)余運(yùn)動(dòng)俱樂(lè)部,員工可以自由報(bào)名。運(yùn)動(dòng)的種類根據(jù)部門(mén)決定,這樣就有了四個(gè)實(shí)體,公司,部門(mén),員工和運(yùn)動(dòng)。而它們的關(guān)系是,公司:部門(mén),部門(mén):?jiǎn)T工都是1:N關(guān)系,而部門(mén)對(duì)運(yùn)動(dòng)是N:M關(guān)系。

如果我們要用一條sql語(yǔ)句做一個(gè)如下圖的報(bào)名頁(yè)面,應(yīng)該怎么實(shí)現(xiàn)呢?

ibatis resultMap groupBy屬性怎么用

首先我們必須定義resultMap,代碼如下:


 




  


  


Select
*
  FROM
tbDepartment, tbStaff, tbResult, tbDepSport
Where
tbStaff.deptid = tbDepartment.deptID
AND
tbSport.sportid = tbDepSport.sportid
AND
tbDepartment.deptID = tbDepSport.deptID

問(wèn)題分析:

為什么會(huì)有這種問(wèn)題,問(wèn)題的關(guān)鍵在于屬性groupBy。

首先我們先分析一下執(zhí)行以上sql語(yǔ)句所出來(lái)的結(jié)果集:

開(kāi)發(fā)支持部 員工甲 足球
開(kāi)發(fā)支持部 員工甲 籃球
開(kāi)發(fā)支持部 員工甲 羽毛球
開(kāi)發(fā)支持部 員工乙 足球
開(kāi)發(fā)支持部 員工乙 籃球
開(kāi)發(fā)支持部 員工乙 羽毛球
開(kāi)發(fā)支持部 員工丙 足球
開(kāi)發(fā)支持部 員工丙 籃球
開(kāi)發(fā)支持部 員工丙 羽毛球
開(kāi)發(fā)支持部 員工丁 足球 
開(kāi)發(fā)支持部 員工丁 籃球 
開(kāi)發(fā)支持部 員工丁 羽毛球
開(kāi)發(fā)支持部 員工卯 足球
開(kāi)發(fā)支持部 員工卯 籃球
開(kāi)發(fā)支持部 員工卯 羽毛球
基礎(chǔ)架構(gòu)部 員工己 足球
基礎(chǔ)架構(gòu)部 員工己 籃球
基礎(chǔ)架構(gòu)部 員工己 羽毛球
基礎(chǔ)架構(gòu)部 員工庚 足球
基礎(chǔ)架構(gòu)部 員工庚 籃球
基礎(chǔ)架構(gòu)部 員工庚 羽毛球
基礎(chǔ)架構(gòu)部 員工申 足球
基礎(chǔ)架構(gòu)部 員工申 籃球
基礎(chǔ)架構(gòu)部 員工申 羽毛球
基礎(chǔ)架構(gòu)部 員工壬 足球
基礎(chǔ)架構(gòu)部 員工壬 籃球
基礎(chǔ)架構(gòu)部 員工壬 羽毛球
基礎(chǔ)架構(gòu)部 員工葵 足球
基礎(chǔ)架構(gòu)部 員工葵 籃球
基礎(chǔ)架構(gòu)部 員工葵 羽毛球

這是一個(gè)笛卡爾積的結(jié)果,有很多冗余的結(jié)果,ibatis resultMap是怎么處理這個(gè)結(jié)果集的?

首先當(dāng)程序執(zhí)行id為getEverything的statement時(shí),先找到resultMap:DepartmentResult

由于DepartmentResult有g(shù)roupBy關(guān)鍵字,因此DepartmentResult會(huì)根據(jù)groupBy的值過(guò)濾掉重復(fù)的結(jié)果,并映射到departVo里的相關(guān)屬性,然后放在一個(gè)List對(duì)象里面,***成功篩選出兩個(gè)部門(mén)。

在處理DepartmentResult中字段的同時(shí)找到了resultMap:StaffResult,發(fā)現(xiàn)StaffResult有g(shù)roupBy關(guān)鍵字,同理又根據(jù)groupBy的值過(guò)濾掉重復(fù)的字段,這里由于兩個(gè)部門(mén)的員工都不一樣,因此過(guò)濾重復(fù)的結(jié)果后就能得到每個(gè)部門(mén)的員工列表。

***處理resultMap:StaffResult,同樣的道理會(huì)過(guò)濾掉相同的結(jié)果。如果兩個(gè)部門(mén)的運(yùn)動(dòng)是不一致的,那么我們很輕松就能得到兩個(gè)運(yùn)動(dòng)的結(jié)果集。但假如兩個(gè)部門(mén)的運(yùn)動(dòng)是一樣的,由于groupBy的關(guān)系,***我們只能得到一個(gè)運(yùn)動(dòng)結(jié)果集,就是上圖的結(jié)果。

解決辦法:

其實(shí)我覺(jué)得這是ibatis的一個(gè)bug,如果resultMap的groupBy能向上繼承,那么 StaffResult的groupBy實(shí)際上就是deptID和sportID,那么就不會(huì)出現(xiàn)這種情況。因此要解決這個(gè)問(wèn)題,我們必須要在 StaffResult中引入deptID,并且修改groupBy屬性。

同時(shí)為了ibatis能正常映射,我們還要在SportVo中增加deptID屬性。

關(guān)于“ibatis resultMap groupBy屬性怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI