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