近期接觸一個(gè)項(xiàng)目,實(shí)體和數(shù)據(jù)庫(kù)的關(guān)系是通過(guò)*.hbm.xml 文件進(jìn)行關(guān)系映射的。由于一個(gè)接口進(jìn)行查詢(xún)的時(shí)候,查詢(xún)出了一個(gè)表的clob字段,導(dǎo)致查詢(xún)速度十分慢,因此考慮不需要用到這個(gè)字段時(shí)候,不查詢(xún)這個(gè)clob。
目前有一個(gè)A實(shí)體,A.hbm.xml內(nèi)容為:A.a、A.b、A.c,其中A.c為一個(gè)Set<C>,C為另外一個(gè)實(shí)體,clob字段就在C里面,C.hbm.xml 內(nèi)容為:C.a、C.b(clob)。
查詢(xún)HQL="from A";
通過(guò)執(zhí)行這個(gè)HQL會(huì)得到一個(gè)List<A>。
使用場(chǎng)景是有時(shí)需要 查詢(xún)出C.b 有時(shí)又不需要。
為解決以上問(wèn)題,有兩種解決方案:
1、使用select 語(yǔ)句進(jìn)行自定查詢(xún)
當(dāng)不需要查詢(xún)出C.b的時(shí)候可以將HQL語(yǔ)句改為以下幾種:
1)select A.a,A.b,A.c.a from A
結(jié)果list中,每條記錄對(duì)應(yīng)一個(gè)object數(shù)組,object[]中每個(gè)元素為hql語(yǔ)句中列的序號(hào)(從0開(kāi)始)。
2)select new map(A.a,A.b,A.c.a) from A
?? 結(jié)果list中,每條記錄對(duì)應(yīng)一個(gè)map,map中key為hql語(yǔ)句中的序號(hào),從0開(kāi)始,key為字符,非數(shù)字。
3) select new A(A.a,A.b,A.c.a) from A
?? 結(jié)果list中,每條記錄對(duì)應(yīng)一個(gè)A實(shí)體,需要添加相應(yīng)的構(gòu)造方法。
以上查詢(xún)只適合結(jié)構(gòu)簡(jiǎn)單的實(shí)體,且查詢(xún)效率比較低,需要拿到數(shù)據(jù)后自己重新組裝,當(dāng)屬性字段比較多,結(jié)構(gòu)復(fù)雜時(shí),這種寫(xiě)法根本不現(xiàn)實(shí)。
2、使用第二套配置文件
當(dāng)實(shí)體結(jié)構(gòu)復(fù)雜時(shí)可以采用此方法進(jìn)行自定義字段查詢(xún)(研究了很久才找出來(lái)的)。
1)copy 類(lèi)A和A.hbm.xml類(lèi)C 分別命名為 :A2和C2(當(dāng)然你也可以用其他命名);
?? copy A.hbm.xml和C.hbm.xml配置文件 分別名為:A2.hbm.xml和C2.hbm.xml。
?2)將A2中的c屬性(set<C>)改為set<C2>,A2.hbm.xml中的映射實(shí)體改為A2,c屬性映射實(shí)體改為C2.
3) C2.hbm.xml中的映射實(shí)體改為C2,去掉C.b(clob)屬性.
4)修改HQL為 “from A2”.
通過(guò)以上步驟,就已經(jīng)實(shí)現(xiàn)的對(duì)屬性字段自定義查詢(xún),優(yōu)點(diǎn)是修改簡(jiǎn)單,使用簡(jiǎn)單,適合復(fù)雜關(guān)系的實(shí)體。
?
?
總結(jié):
本人沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò)hibernate,對(duì)hibernate的各個(gè)知識(shí)點(diǎn)也不是很了解,如有不對(duì)的地方多多見(jiàn)諒。當(dāng)接觸的項(xiàng)目需要進(jìn)行這樣一個(gè)修改的時(shí)候,現(xiàn)在網(wǎng)上查找資料,嘗試了第一種方法,但由于實(shí)體關(guān)系復(fù)雜,第一種方法怎么都達(dá)不到效果。嘗試很久,自己琢磨出了第二種方法,很好解決了這個(gè)應(yīng)用場(chǎng)景,缺點(diǎn)也是十分明顯,增加了很多文件。但能解決問(wèn)題是第一步,寫(xiě)下此文,與大家分享和交流,如果對(duì)你有用,最好不過(guò)。
?
需要聯(lián)系交流的可以加我QQ:549562511.
?
?