新聞中心
Hibernate配備了一種非常強(qiáng)大的Hibernate查詢語(yǔ)言,這種語(yǔ)言看上去很像SQL。本文主要介紹大小寫(xiě)敏感性問(wèn)題、from子句、關(guān)聯(lián)(Association)與連接(Join)等。但是不要被語(yǔ)法結(jié)構(gòu) 上的相似所迷惑,HQL是非常有意識(shí)的被設(shè)計(jì)為完全面向?qū)ο蟮牟樵?,它可以理解如繼承、多態(tài) 和關(guān)聯(lián)之類(lèi)的概念。

成都創(chuàng)新互聯(lián)長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為普蘭店企業(yè)提供專(zhuān)業(yè)的成都做網(wǎng)站、網(wǎng)站制作,普蘭店網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
1. 大小寫(xiě)敏感性問(wèn)題
除了Java類(lèi)與屬性的名稱外,查詢語(yǔ)句對(duì)大小寫(xiě)并不敏感。 所以 SeLeCT 與 sELEct 以及 SELECT 是相同的,但是 org.hibernate.eg.FOO 并不等價(jià)于 org.hibernate.eg.Foo 并且 foo.barSet 也不等價(jià)于 foo.BARSET。
本手冊(cè)中的HQL關(guān)鍵字將使用小寫(xiě)字母. 很多用戶發(fā)現(xiàn)使用完全大寫(xiě)的關(guān)鍵字會(huì)使查詢語(yǔ)句 的可讀性更強(qiáng), 但我們發(fā)現(xiàn),當(dāng)把查詢語(yǔ)句嵌入到Java語(yǔ)句中的時(shí)候使用大寫(xiě)關(guān)鍵字比較難看。
2. from子句
最簡(jiǎn)單的Hibernate查詢語(yǔ)句的形式如下:
- from eg.Cat
該子句簡(jiǎn)單的返回eg.Cat類(lèi)的所有實(shí)例。 通常我們不需要使用類(lèi)的全限定名, 因?yàn)?auto-import(自動(dòng)引入) 是缺省的情況。 所以我們幾乎只使用如下的簡(jiǎn)單寫(xiě)法:
- from Cat
大多數(shù)情況下, 你需要指定一個(gè)別名, 原因是你可能需要 在Hibernate查詢語(yǔ)言的其它部分引用到Cat
- om Cat as cat
這個(gè)語(yǔ)句把別名cat指定給類(lèi)Cat 的實(shí)例, 這樣我們就可以在隨后的查詢中使用此別名了。 關(guān)鍵字as 是可選的,我們也可以這樣寫(xiě):
- from Cat cat
子句中可以同時(shí)出現(xiàn)多個(gè)類(lèi), 其查詢結(jié)果是產(chǎn)生一個(gè)笛卡兒積或產(chǎn)生跨表的連接。
- from Formula, Parameter
- from Formula as form, Parameter as param
查詢語(yǔ)句中別名的開(kāi)頭部分小寫(xiě)被認(rèn)為是實(shí)踐中的好習(xí)慣, 這樣做與Java變量的命名標(biāo)準(zhǔn)保持了一致 (比如,domesticCat)。
3. 關(guān)聯(lián)(Association)與連接(Join)
Hibernate查詢語(yǔ)言,我們也可以為相關(guān)聯(lián)的實(shí)體甚至是對(duì)一個(gè)集合中的全部元素指定一個(gè)別名, 這時(shí)要使用關(guān)鍵字join。
- from Cat as cat
- inner join cat.mate as mate
- left outer join cat.kittens as kitten
- from Cat as cat left join cat.mate.kittens as kittens
- from Formula form full join form.parameter param
受支持的連接類(lèi)型是從ANSI SQL中借鑒來(lái)的。
inner join(內(nèi)連接)
left outer join(左外連接)
right outer join(右外連接)
full join (全連接,并不常用)
語(yǔ)句inner join, left outer join 以及 right outer join 可以簡(jiǎn)寫(xiě)。
- from Cat as cat
- join cat.mate as mate
- left join cat.kittens as kitten
還有,一個(gè)"fetch"連接允許僅僅使用一個(gè)選擇語(yǔ)句就將相關(guān)聯(lián)的對(duì)象或一組值的集合隨著他們的父對(duì)象的初始化而被初始化,這種方法在使用到集合的情況下尤其有用,對(duì)于關(guān)聯(lián)和集合來(lái)說(shuō),它有效的代替了映射文件中的外聯(lián)接 與延遲聲明(lazy declarations). 查看 第 19.1 節(jié) “ 抓取策略(Fetching strategies) ” 以獲得等多的信息。
- from Cat as cat
- inner join fetch cat.mate
- left join fetch cat.kittens
一個(gè)fetch連接通常不需要被指定別名, 因?yàn)橄嚓P(guān)聯(lián)的對(duì)象不應(yīng)當(dāng)被用在 where 子句 (或其它任何子句)中。同時(shí),相關(guān)聯(lián)的對(duì)象 并不在查詢的結(jié)果中直接返回,但可以通過(guò)他們的父對(duì)象來(lái)訪問(wèn)到他們。
注意,在目前的版本中,一個(gè)查詢中只有一個(gè)集合角色能被連接取得(超過(guò)一個(gè)的角色將會(huì)導(dǎo)致形成一個(gè)笛卡兒積)。 同時(shí)注意fetch構(gòu)造變量在使用了scroll() 或 iterate()函數(shù) 的查詢中是不能使用的。***注意,使用full join fetch 與 right join fetch是沒(méi)有意義的。
如果你使用屬性級(jí)別的延遲獲?。╨azy fetching)(這是通過(guò)重新編寫(xiě)字節(jié)碼實(shí)現(xiàn)的),可以使用 fetch all properties 來(lái)強(qiáng)制Hibernate立即取得那些原本需要延遲加載的屬性(在***個(gè)查詢中)。
- from Document fetch all properties order by name
- from Document doc fetch all properties where lower(doc.name) like '%cats%'
【編輯推薦】
- 簡(jiǎn)述Hibernate部分查詢語(yǔ)言(二)
- Hibernate的重要技術(shù)簡(jiǎn)介
- Struts-Spring-Hibernate案例
- Hibernate Sessin接口常用方法
- Hibernate事務(wù)全面介紹
名稱欄目:簡(jiǎn)述Hibernate部分查詢語(yǔ)言(一)
標(biāo)題URL:http://m.fisionsoft.com.cn/article/cosjpic.html


咨詢
建站咨詢
