成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ibatis resultMap groupBy屬性巧使用

開發(fā) 后端
您在使用ibatis resultMap過程中有沒有遇到過一個問題,就是groupBy的不能繼承問題?如果有的話,請您來看看這篇文章是如何解決ibatis resultMap中的groupBy不能繼承問題的。

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

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

ibatis resultMap groupBy問題描述:

考慮一下這種情況,假如一家公司為了員工福利決定搞業(yè)余運動俱樂部,員工可以自由報名。運動的種類根據(jù)部門決定,這樣就有了四個實體,公司,部門,員工和運動。而它們的關(guān)系是,公司:部門,部門:員工都是1:N關(guān)系,而部門對運動是N:M關(guān)系。

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

 

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

 


     
   
   
   


     
   


     
   


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

問題分析:

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

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

開發(fā)支持部 員工甲 足球
開發(fā)支持部 員工甲 籃球
開發(fā)支持部 員工甲 羽毛球
開發(fā)支持部 員工乙 足球
開發(fā)支持部 員工乙 籃球
開發(fā)支持部 員工乙 羽毛球
開發(fā)支持部 員工丙 足球
開發(fā)支持部 員工丙 籃球
開發(fā)支持部 員工丙 羽毛球
開發(fā)支持部 員工丁 足球 
開發(fā)支持部 員工丁 籃球 
開發(fā)支持部 員工丁 羽毛球
開發(fā)支持部 員工卯 足球
開發(fā)支持部 員工卯 籃球
開發(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)部 員工葵 羽毛球

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

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

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

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

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

解決辦法:

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


   
     
   

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

問題解決了,但破壞了SportVo的獨立性,如果您有更好的解決辦法歡迎與51CTO聯(lián)系。

【編輯推薦】

  1. 了解iBatis.Net中的ResultMap
  2. ibatis標(biāo)簽詳解
  3. ibatis resultMap報錯解決一例
  4. ibatis下加入c3p0連接池的方法
  5. ibatis也能用proxool連接池
責(zé)任編輯:桑丘 來源: 雨中漫步的太陽的blog
相關(guān)推薦

2009-07-22 10:03:11

iBATIS Resu

2009-07-16 13:03:05

ibatis resu

2009-07-16 13:50:31

ibatisResultMap

2009-07-17 17:05:44

iBATIS緩存cacheModel

2009-07-22 10:42:59

iBATIS Cach

2009-11-13 10:57:28

ADO.NET Dat

2009-07-16 17:40:48

iBATIS高級查詢iBATIS使用

2009-07-21 09:29:27

iBATIS使用

2009-07-16 09:56:32

什么是iBATIS

2009-07-16 11:40:23

ibatis自動生成abator

2009-07-15 15:47:49

iBATIS是什么

2009-07-21 11:12:00

iBATIS配置

2010-12-01 11:29:11

職場

2012-05-08 10:22:47

Windows系統(tǒng)硬件

2009-07-20 15:27:22

Castle.DynaiBATIS.NET

2009-08-14 10:26:27

ibatis多數(shù)據(jù)源

2009-07-16 11:21:19

ibatis主鍵自動生成

2009-09-21 16:56:14

Hibernateibatis

2009-07-16 09:14:26

iBATIS DAO

2009-07-15 17:19:31

iBATIS Ecli
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 美女视频. | 亚洲视频免费在线观看 | 欧美日韩中文字幕在线 | 精品在线观看一区二区 | 蜜月aⅴ国产精品 | 久久久综合久久 | 成人在线播放网站 | 免费在线观看成人 | 久久久久久免费免费 | 波多野结衣av中文字幕 | 久久久久久高潮国产精品视 | 亚洲色图在线观看 | 欧美激情视频网站 | 日韩一区在线观看视频 | 免费一级黄色电影 | 亚洲欧美日韩高清 | 欧美成人在线免费 | 日本精品视频在线观看 | 精品国产乱码久久久久久图片 | 中文字幕不卡在线观看 | 特黄毛片 | 综合国产 | 精品1区2区 | 91免费电影| 婷婷色网 | 国内自拍偷拍 | 精品视频在线观看 | 免费视频二区 | 欧美日韩亚洲一区 | 成人av免费在线观看 | 日韩精品在线一区 | 国产真实乱对白精彩久久小说 | 男人天堂av网 | 国产精品亚洲精品日韩已方 | 久久久美女 | 狠狠狠色丁香婷婷综合久久五月 | 精品视频一区二区三区 | 国产精品久久久久9999鸭 | 天天夜天天操 | 亚洲国产午夜 | 日韩精品一区二区三区视频播放 |