簡(jiǎn)述Hibernate部分查詢語言(一)
Hibernate配備了一種非常強(qiáng)大的Hibernate查詢語言,這種語言看上去很像SQL。本文主要介紹大小寫敏感性問題、from子句、關(guān)聯(lián)(Association)與連接(Join)等。但是不要被語法結(jié)構(gòu) 上的相似所迷惑,HQL是非常有意識(shí)的被設(shè)計(jì)為完全面向?qū)ο蟮牟樵?,它可以理解如繼承、多態(tài) 和關(guān)聯(lián)之類的概念。
1. 大小寫敏感性問題
除了Java類與屬性的名稱外,查詢語句對(duì)大小寫并不敏感。 所以 SeLeCT 與 sELEct 以及 SELECT 是相同的,但是 org.hibernate.eg.FOO 并不等價(jià)于 org.hibernate.eg.Foo 并且 foo.barSet 也不等價(jià)于 foo.BARSET。
本手冊(cè)中的HQL關(guān)鍵字將使用小寫字母. 很多用戶發(fā)現(xiàn)使用完全大寫的關(guān)鍵字會(huì)使查詢語句 的可讀性更強(qiáng), 但我們發(fā)現(xiàn),當(dāng)把查詢語句嵌入到Java語句中的時(shí)候使用大寫關(guān)鍵字比較難看。
2. from子句
最簡(jiǎn)單的Hibernate查詢語句的形式如下:
- from eg.Cat
該子句簡(jiǎn)單的返回eg.Cat類的所有實(shí)例。 通常我們不需要使用類的全限定名, 因?yàn)?auto-import(自動(dòng)引入) 是缺省的情況。 所以我們幾乎只使用如下的簡(jiǎn)單寫法:
- from Cat
大多數(shù)情況下, 你需要指定一個(gè)別名, 原因是你可能需要 在Hibernate查詢語言的其它部分引用到Cat
- om Cat as cat
這個(gè)語句把別名cat指定給類Cat 的實(shí)例, 這樣我們就可以在隨后的查詢中使用此別名了。 關(guān)鍵字as 是可選的,我們也可以這樣寫:
- from Cat cat
子句中可以同時(shí)出現(xiàn)多個(gè)類, 其查詢結(jié)果是產(chǎn)生一個(gè)笛卡兒積或產(chǎn)生跨表的連接。
- from Formula, Parameter
- from Formula as form, Parameter as param
查詢語句中別名的開頭部分小寫被認(rèn)為是實(shí)踐中的好習(xí)慣, 這樣做與Java變量的命名標(biāo)準(zhǔn)保持了一致 (比如,domesticCat)。
3. 關(guān)聯(lián)(Association)與連接(Join)
Hibernate查詢語言,我們也可以為相關(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
受支持的連接類型是從ANSI SQL中借鑒來的。
inner join(內(nèi)連接)
left outer join(左外連接)
right outer join(右外連接)
full join (全連接,并不常用)
語句inner join, left outer join 以及 right outer join 可以簡(jiǎn)寫。
- from Cat as cat
- join cat.mate as mate
- left join cat.kittens as kitten
還有,一個(gè)"fetch"連接允許僅僅使用一個(gè)選擇語句就將相關(guān)聯(lián)的對(duì)象或一組值的集合隨著他們的父對(duì)象的初始化而被初始化,這種方法在使用到集合的情況下尤其有用,對(duì)于關(guān)聯(lián)和集合來說,它有效的代替了映射文件中的外聯(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é)果中直接返回,但可以通過他們的父對(duì)象來訪問到他們。
注意,在目前的版本中,一個(gè)查詢中只有一個(gè)集合角色能被連接取得(超過一個(gè)的角色將會(huì)導(dǎo)致形成一個(gè)笛卡兒積)。 同時(shí)注意fetch構(gòu)造變量在使用了scroll() 或 iterate()函數(shù) 的查詢中是不能使用的。***注意,使用full join fetch 與 right join fetch是沒有意義的。
如果你使用屬性級(jí)別的延遲獲?。╨azy fetching)(這是通過重新編寫字節(jié)碼實(shí)現(xiàn)的),可以使用 fetch all properties 來強(qiáng)制Hibernate立即取得那些原本需要延遲加載的屬性(在***個(gè)查詢中)。
- from Document fetch all properties order by name
- from Document doc fetch all properties where lower(doc.name) like '%cats%'
【編輯推薦】