hibernate通過(guò)映射文件過(guò)濾查詢(xún)字段

近期接觸一個(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.

?

?

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,697評(píng)論 18 399
  • Hibernate: 一個(gè)持久化框架 一個(gè)ORM框架 加載:根據(jù)特定的OID,把一個(gè)對(duì)象從數(shù)據(jù)庫(kù)加載到內(nèi)存中OID...
    JHMichael閱讀 2,093評(píng)論 0 27
  • 本文包括:1、Hibernate 的查詢(xún)方式2、HQL (Hibernate Query Language) 查詢(xún)...
    廖少少閱讀 2,717評(píng)論 0 15
  • 分割線 引用 代碼 表格 甘特圖 序列圖 graph LR 數(shù)學(xué)公式 鏈接link 圖片 劃線++下劃線++B粗體...
    Albert陳凱閱讀 522評(píng)論 0 0

友情鏈接更多精彩內(nèi)容