簡述Hibernate部分查詢語句
Hibernate配備了一種非常強大的Hibernate查詢語句,這種語言看上去很像SQL。本文主要介紹select子句、聚集函數(shù)、多態(tài)查詢。但是不要被語法結(jié)構(gòu) 上的相似所迷惑,HQL是非常有意識的被設(shè)計為完全面向?qū)ο蟮牟樵?,它可以理解如繼承、多態(tài) 和關(guān)聯(lián)之類的概念。
1. select子句
select 子句選擇將哪些對象與屬性返 回到查詢結(jié)果集中. 考慮如下情況:
- select mate
- from Cat as cat
- inner join cat.mate as mate
該語句將選擇mates of other Cats。(其他貓的配偶) 實際上, 你可以更簡潔的用以下的查詢語句表達相同的含義:
- select cat.mate from Cat cat
Hibernate查詢語句可以返回值為任何類型的屬性,包括返回類型為某種組件(Component)的屬性:
- select cat.name from DomesticCat cat
- where cat.name like 'fri%'
- select cust.name.firstName from Customer as cust
Hibernate查詢語句可以返回多個對象和(或)屬性,存放在 Object[]隊列中,
- select mother, offspr, mate.name
- from DomesticCat as mother
- inner join mother.mate as mate
- left outer join mother.kittens as offspr
或存放在一個List對象中,
- select new list(mother, offspr, mate.name)
- from DomesticCat as mother
- inner join mother.mate as mate
- left outer join mother.kittens as offspr
也可能直接返回一個實際的類型安全的Java對象,
- select new Family(mother, mate, offspr)
- from DomesticCat as mother
- join mother.mate as mate
- left join mother.kittens as offspr
假設(shè)類Family有一個合適的構(gòu)造函數(shù).
你可以使用關(guān)鍵字as給“被選擇了的表達式”指派別名:
- select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
- from Cat cat
這種做法在與子句select new map一起使用時最有用:
- select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
- from Cat cat
該Hibernate查詢語句返回了一個Map的對象,內(nèi)容是別名與被選擇的值組成的名-值映射。
3. 聚集函數(shù)
HQL查詢甚至可以返回作用于屬性之上的聚集函數(shù)的計算結(jié)果:
- select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
- from Cat cat
受支持的聚集函數(shù)如下:
- avg(...), sum(...), min(...), max(...)
- count(*)
- count(...), count(distinct ...), count(all...)
你可以在選擇子句中使用數(shù)學(xué)操作符、連接以及經(jīng)過驗證的SQL函數(shù):
- select cat.weight + sum(kitten.weight)
- from Cat cat
- join cat.kittens kitten
- group by cat.id, cat.weight
- select firstName||' '||initial||' '||upper(lastName) from Person
關(guān)鍵字distinct與all 也可以使用,它們具有與SQL相同的語義.
- select distinct cat.name from Cat cat
- select count(distinct cat.name), count(cat) from Cat cat
3. 多態(tài)查詢
一個如下的Hibernate查詢語句:
- from Cat as cat
不僅返回Cat類的實例, 也同時返回子類 DomesticCat的實例. Hibernate 可以在from子句中指定任何 Java 類或接口. 查詢會返回繼承了該類的所有持久化子類 的實例或返回聲明了該接口的所有持久化類的實例。下面的查詢語句返回所有的被持久化的對象:
- from java.lang.Object o
接口Named 可能被各種各樣的持久化類聲明:
- from Named n, Named m where n.name = m.name
注意:***的兩個查詢將需要超過一個的SQL SELECT.這表明order by子句 沒有對整個結(jié)果集進行正確的排序. (這也說明你不能對這樣的查詢使用Query.scroll()方法.)
【編輯推薦】