posts - 66,  comments - 11,  trackbacks - 0

              Criteria提供了符合面向?qū)ο缶幊田L格的查詢封裝模式。不過HQL提供了更加豐富靈活的特性,它在涵蓋了Criteria功能范圍的前提下,提供了更為強大的查詢能力。HQL基于SQL,同時提供了更加面向?qū)ο蟮姆庋b。
              實體查詢:HQL子句本身大小寫無關(guān),但是其中出現(xiàn)的類名和屬性名必須注意大小寫區(qū)分。需要注意的是,Hibernate中,查詢的目標實體存在著繼承關(guān)系的判定,如"from TUser"將返回所有TUser以及TUser子類的記錄,我們知道,Java中所有類的根類都是java.lang.Object,那么,如下HQL將返回數(shù)據(jù)庫中所有庫表的記錄:"from java.lang.Object",在where子句中,我們可以通過比較操作符指定條件,=,<>,>,>,<=,>=,between,notbetween,in,not in,is,like等。與SQL相同,我們可以通過and,or等邏輯連接符組合各個邏輯表達式。

              屬性查詢:有時我們并不需要獲取完整的實體對象,只需要現(xiàn)實部分列,通過HQL也可以做到這點,如:"select user.name,user.age form TUser user"表明我們需要讀取name和age屬性的內(nèi)容,而此時,返回的list數(shù)據(jù)結(jié)構(gòu)中,每個條目都是一個對象數(shù)組(Object[]),其中一次包含了我們所獲取的屬性數(shù)據(jù)。
              如果覺得返回數(shù)組的方式不夠符合面向?qū)ο蟮娘L格,我們可以通過在HQL中動態(tài)構(gòu)造對象實例的方法對這些平面化的數(shù)據(jù)進行封裝。"select new TUser(user.name,user.age) from TUser user",我們通過HQL獲取數(shù)據(jù)的部分屬性值,與此同時,我們也可以在HQL的select字句中使用統(tǒng)計函數(shù),甚至原生SQL函數(shù),或者利用distinct關(guān)鍵字,剔除返回集中的重復(fù)記錄。

              實體更新與刪除:在Hibernate2中,HQL僅僅用于數(shù)據(jù)查詢,而在Hibernate3中,HQL具備了更加強大的功能。實體更新與刪除就是其中的主要特征之一。

              分組和排序:與SQL類似,HQL通過order by子句實現(xiàn)對查詢結(jié)果的排序,order by子句可以指定多個排序條件:"from TUser user order by user.name ,user.age desc"通過Group by子句可進行分組統(tǒng)計。如:"select count(user),user.age from TUser user group by user.age",我們知道where子句可以對記錄進行甄選。那么,對于Group by子句獲得的結(jié)果集我們可以通過Having子句進行甄選。例如:"select count(user),user.age from TUser user gourp by user.age having count(user)>10".

               參數(shù)綁定:類似JDBC中的SQL操作,我們可以通過順序占位符"?"對參數(shù)進行標識,并在之后對參數(shù)內(nèi)容進行填充。建議使用Query接口"from TUser user where user.name=? and user.age>?",這里除了順序占位符,我們還可以使用引用占位符,如:"from TUser where name=:name"參數(shù)綁定機制可以使得查詢語法與具體參數(shù)數(shù)值相互獨立。這樣,對于參數(shù)不同,查詢語法相同的查詢操作,數(shù)據(jù)庫即可實施性能優(yōu)化策略。同時,參數(shù)綁定機制也杜絕了參數(shù)值對查詢語法本身的影響。

               引用查詢:SQL語句混雜在代碼之間將破壞代碼的可讀性,并使得系統(tǒng)的可維護性降低。為了避免這樣的情況出現(xiàn),我們通常采取將SQL配置化的方式,也就是將SQL保存在配置文件中,需要調(diào)用的時候在進行讀取。
          <query name="queryByName">
           <![CDATA[
            from TUser user where user.name=:name
           ]]>
          </query>
          之后,我們可通過session.getNamedQuery方法從配置文件中調(diào)用引用的HQL.

               聯(lián)合查詢:inner join,left outer join,right outer join,full join
               子查詢:如:"from TUser user where (select count(*) from user.addresses)>1"HQL中,子查詢必須出現(xiàn)在where子句中,且必須以一對圓括號包圍。
               數(shù)據(jù)加載方式:Hibernate支持以下幾種數(shù)據(jù)加載方式:
          1、即時加載:當實體加載完畢后,立即加載其關(guān)聯(lián)數(shù)據(jù)。
          2、延遲加載:實體加載時,其關(guān)聯(lián)數(shù)據(jù)并非即刻獲取,而是當關(guān)聯(lián)數(shù)據(jù)第一次被訪問時再進行讀取。
          3、預(yù)先加載:預(yù)先加載時,實體及其關(guān)聯(lián)對象同時讀取,這與即時加載類似。
          4、批量加載:對于即時加載和延遲加載,可以采用批量加載方式進行性能上的優(yōu)化。

          posted on 2009-11-15 22:25 王永慶 閱讀(324) 評論(0)  編輯  收藏 所屬分類: HIBERNATE
          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 五莲县| 莲花县| 防城港市| 安义县| 伽师县| 资源县| 黄石市| 孝感市| 栾川县| 准格尔旗| 广东省| 铁力市| 静海县| 大英县| 盐城市| 隆子县| 双峰县| 和硕县| 郑州市| 山丹县| 安义县| 石渠县| 神池县| 潜江市| 额敏县| 阿克| 闽清县| 武冈市| 斗六市| 崇文区| 会昌县| 绥宁县| 东阳市| 济阳县| 章丘市| 江源县| 石泉县| 河南省| 辽中县| 新源县| 清新县|