近期接觸一個項目往湿,實體和數(shù)據(jù)庫的關(guān)系是通過*.hbm.xml 文件進(jìn)行關(guān)系映射的妖异。由于一個接口進(jìn)行查詢的時候,查詢出了一個表的clob字段领追,導(dǎo)致查詢速度十分慢他膳,因此考慮不需要用到這個字段時候,不查詢這個clob绒窑。
目前有一個A實體棕孙,A.hbm.xml內(nèi)容為:A.a、A.b、A.c蟀俊,其中A.c為一個Set<C>,C為另外一個實體钦铺,clob字段就在C里面,C.hbm.xml 內(nèi)容為:C.a肢预、C.b(clob)矛洞。
查詢HQL="from A";
通過執(zhí)行這個HQL會得到一個List<A>。
使用場景是有時需要 查詢出C.b 有時又不需要烫映。
為解決以上問題沼本,有兩種解決方案:
1、使用select 語句進(jìn)行自定查詢
當(dāng)不需要查詢出C.b的時候可以將HQL語句改為以下幾種:
1)select A.a,A.b,A.c.a from A
結(jié)果list中锭沟,每條記錄對應(yīng)一個object數(shù)組抽兆,object[]中每個元素為hql語句中列的序號(從0開始)。
2)select new map(A.a,A.b,A.c.a) from A
?? 結(jié)果list中族淮,每條記錄對應(yīng)一個map辫红,map中key為hql語句中的序號,從0開始祝辣,key為字符厉熟,非數(shù)字。
3) select new A(A.a,A.b,A.c.a) from A
?? 結(jié)果list中较幌,每條記錄對應(yīng)一個A實體揍瑟,需要添加相應(yīng)的構(gòu)造方法。
以上查詢只適合結(jié)構(gòu)簡單的實體乍炉,且查詢效率比較低绢片,需要拿到數(shù)據(jù)后自己重新組裝,當(dāng)屬性字段比較多岛琼,結(jié)構(gòu)復(fù)雜時底循,這種寫法根本不現(xiàn)實。
2槐瑞、使用第二套配置文件
當(dāng)實體結(jié)構(gòu)復(fù)雜時可以采用此方法進(jìn)行自定義字段查詢(研究了很久才找出來的)熙涤。
1)copy 類A和A.hbm.xml類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中的映射實體改為A2,c屬性映射實體改為C2.
3) C2.hbm.xml中的映射實體改為C2,去掉C.b(clob)屬性.
4)修改HQL為 “from A2”.
通過以上步驟,就已經(jīng)實現(xiàn)的對屬性字段自定義查詢悼沿,優(yōu)點是修改簡單等舔,使用簡單,適合復(fù)雜關(guān)系的實體糟趾。
?
?
總結(jié):
本人沒有系統(tǒng)的學(xué)習(xí)過hibernate,對hibernate的各個知識點也不是很了解慌植,如有不對的地方多多見諒甚牲。當(dāng)接觸的項目需要進(jìn)行這樣一個修改的時候,現(xiàn)在網(wǎng)上查找資料蝶柿,嘗試了第一種方法丈钙,但由于實體關(guān)系復(fù)雜,第一種方法怎么都達(dá)不到效果交汤。嘗試很久雏赦,自己琢磨出了第二種方法,很好解決了這個應(yīng)用場景蜻展,缺點也是十分明顯,增加了很多文件邀摆。但能解決問題是第一步纵顾,寫下此文,與大家分享和交流栋盹,如果對你有用施逾,最好不過。
?
需要聯(lián)系交流的可以加我QQ:549562511.
?
?