成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate查詢語言HQL 八大要點

開發 后端
本文講述Hibernate查詢語言HQL。Hibernate擁有一種功能非常強大的查詢語言,這種語言被有意得與SQL非常相似,便于開發人員掌握。但不要被HQL的語法表面所迷惑,HQL完全是面向對象的,可以用來過程多態、繼承、關聯等關系。

Hibernate擁有一種功能非常強大的查詢語言,這種語言被有意得與SQL非常相似,便于開發人員掌握。但不要被HQL的語法表面所迷惑,HQL完全是面向對象的,可以用來過程多態、繼承、關聯等關系。

1大小寫敏感(Case Sensitivity)

HQL中的使用的Java的類名和屬性名是大小寫敏感的,其他的關鍵字都是大小寫不敏感的。所以“SeLeCT”等同與“sELEct”,也等同于“SELECT”,因為它不是Java類名,也不是Java類的屬性名。但Java類net.sf.hibernate.eg.FOO不等同于net.sf.hibernate.eg.Foo,同樣foo.barSet也不等同于foo.BARSET。

在本手冊中,HQL中的關鍵字均采用小寫,一些用戶可能發現HQL的關鍵字采用大寫更易讀,但我們也發現,當把這些HQL嵌入Java代碼中,看起來很丑陋。

2from從句(The from clause)

Hibernate中最簡單的from查詢可能是:

  1. from eg.Cat 

只是簡單的返回eg.Cat類的所有實例。

在很多時候你可能需要為類設置別名(alias),因為你可能需要在查詢的其他部分引用Cat。

  1. from eg.Cat as cat 

關鍵字as是可選的,我們也可以寫成:

  1. from eg.Cat cat 

可以出現多個類,然后返回一個“笛卡兒積”或交叉連接:

  1. from Formula as form, Parameter as param 

HQL中的別名用小寫字母是一個好習慣,符合Java本地變量的命名規范。

3關聯和連接(Associations and joins)

我們使用別名關聯實體、甚至用join來關聯值的集合的元素。

  1. from eg.Cat as cat  
  2.  
  3.     inner join cat.mate as mate  
  4.  
  5.     left outer join cat.kittens as kitten  
  6.  
  7. from eg.Cat as cat left join cat.mate.kittens as kittens  
  8.  
  9. 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可以簡寫。

  1. from eg.Cat as cat  
  2.  
  3.     join cat.mate as mate  
  4.  
  5.     left join cat.kittens as kitten  

另外,一個“fetch”連接允許使用單連接來關聯或值的集合,使它們可以和父對象一起來初始化。這在使用Collection的情況下特別有用。

  1. from eg.Cat as cat  
  2.  
  3.     inner join fetch cat.mate  
  4.  
  5.     left join fetch cat.kittens  

fetch join通常不需要設置別名,因為被關聯的對象不應該被用在where從句中,也不能用在其他的任何從句中。

被關聯的對象不能直接在查詢結果中返回,他們可以通過父對象來訪問。

請注意:在目前的實現中,在查詢中只能返回一個集合。另外還要注意,fetch可能不用在被scroll()和iterator()調用的查詢中。***還要注意,full join fetch和right join fetch是沒有意義的。

4 select從句(The select clause)

select從句用來挑選在結果集中返回的對象和屬性:

  1. select cat.mate from eg.Cat cat 

上面這個查詢返回所有貓的配偶。

你也可以使用elements函數返回集合的元素。下面的查詢將返回任何貓(Cat)的所有小貓(Kitten)。

  1. select elements(cat.kittens) from eg.Cat cat 

查詢也可以返回任何值類型(包括Component類型的屬性)的屬性:

  1. select cat.name from eg.DomesticCat cat  
  2.  
  3. where cat.name like 'fri%' 
  4.  
  5. select cust.name.firstName from Customer as cust  

查詢可以返回多個對象,也可以返回作為Object[]類型的數組的屬性。

  1. select mother, offspr, mate.name 
  2.  
  3. from eg.DomesticCat as mother  
  4.  
  5.     inner join mother.mate as mate  
  6.  
  7.     left outer join mother.kittens as offspr  

或者作為一個實際的Java對象:

  1. select new Family(mother, mate, offspr)  
  2.  
  3. from eg.DomesticCat as mother  
  4.  
  5.     join mother.mate as mate  
  6.  
  7.     left join mother.kittens as offspr  

上面的這個查詢語句假設Family類有適當的構造函數。

5 聚集函數(Aggregate functions)

查詢可以使用屬性的聚集函數:

  1. select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)  from eg.Cat cat 

select從句的聚集函數中可以出現集合:

select cat, count( elements(cat.kittens) )  from eg.Cat cat group by cat

支持的聚集函數有:

· avg(...), sum(...), min(...), max(...)

· count(*)

· count(...), count(distinct ...), count(all...)

distinct 和all關鍵字的意義與用法和SQL中相同:

  1. select distinct cat.name from eg.Cat cat  
  2.  
  3. select count(distinct cat.name), count(cat) from eg.Cat cat  

6 多態(polymorphism)

一個查詢:from eg.Cat as cat,它返回的不只是Cat,也有DomesticCat(家貓)這樣的子類。Hibernate可以在from從句中指定任何Java類和接口,查詢將返回繼承自該類和實現了該接口的所有的持久類的實例。下面的查詢將返回所有持久的對象:

  1. from java.lang.Object o 

指定的接口可以被多個不同的持久類實現:

  1. from eg.Named n, eg.Named m where n.name = m.name 

注意***2個查詢將需要超過1個SQL的select,這意味著不能夠按照從句指定的排列次序排列整個結果集。這也意味著你不能用Query.scroll()來調用這些查詢。

7 where從句(The where clause)

where從句是你可以按照自己指定的條件更精確的返回實例:

  1. from eg.Cat as cat where cat.name='Fritz' 

復合表達式使where從句功能非常強大:

  1. from eg.Cat as cat where cat.name='Fritz'  

這個查詢將被翻譯成帶有一個連接的SQL查詢語句。

如果你寫下這句查詢:

  1. from eg.Foo foo where foo.bar.baz.customer.address.city is not null 

這個查詢翻譯成SQL語句需要4個表連接。

“=”操作符不僅可以比較屬性,也可以比較實例:

  1. from eg.Cat cat, eg.Cat rival where cat.mate = rival.mate  
  2.  
  3. select cat, mate  from eg.Cat cat, eg.Cat mate  where cat.mate = mate  

一個叫id的特殊的屬性被用來引用一個對象的唯一標識符,你也可以用對象的屬性名。

  1. from eg.Cat as cat where cat.id = 123  
  2.  
  3. from eg.Cat as cat where cat.mate.id = 69    

這個查詢要比上一個有效率,因為不需要表連接。

可以使用復合主鍵的屬性。假設person有一個由medicareNumber和country構成的符合主鍵:

  1. from bank.Person person  
  2.  
  3. where person.id.country = 'AU' 
  4.  
  5. and person.id.medicareNumber = 123456  
  6.  
  7. from bank.Account account  
  8.  
  9. where account.owner.id.country = 'AU' 
  10.  
  11.     and account.owner.id.medicareNumber = 123456  

再重復一次,第二個查詢效率高些。

同樣,一個指定了屬性的類在多態持久(polymorphic persistence)的情況下訪問實體的discriminator value。

一個被嵌入到where從句中的Java類名將被翻譯成它的discriminator value。

from eg.Cat cat where cat.class = eg.DomesticCat

你也可以指定組件(component)的屬性和用戶自己定義的合成類型(及組件的組件等等)。

永遠也不要使用一個以組件的屬性結尾的路徑表達式。舉個例子,假設store.owner是一個帶有一個叫address組件的實體:

  1. store.owner.address.city    //正確  
  2.  
  3. store.owner.address        //錯誤!  

一個叫“any”的類型有2個特別的屬性,一個是id,另一個是class,它允許我們用下面的辦法進行連接(join)。AuditLog.item是一個用<  any>映射的屬性:

  1. from eg.AuditLog log, eg.Payment payment  
  2.  
  3. where log.item.class = 'eg.Payment' and log.item.id = payment.id  

需要注意的是:查詢中的log.item.class和payment.class將參考完全不同的數據庫列。

8 表達式(Expressions)

where從句中的表達式允許你使用SQL中的很多東西:

· 數學運算符: +, -, *, /

· 二元比較運算符: =, >=, <  =, <  >, !=, like

· 邏輯操作符: and, or, not

· 字符串連接符: ||

· SQL函數,如: upper() and lower()

· 圓括號: ( )

· in, between, is null

· JDBC輸入參數: ?

· 指定的參數::name, :start_date, :x1

· in和between:

  1. from eg.DomesticCat cat where cat.name between 'A' and 'B' 
  2.  
  3. from eg.DomesticCat cat where cat.name in ( 'Foo''Bar''Baz' )  

和否定形式的(negated forms):

  1. from eg.DomesticCat cat where cat.name not between 'A' and 'B' 
  2.  
  3. from eg.DomesticCat cat where cat.name not in ( 'Foo''Bar''Baz' )  

· is null和is not null

· 也可以使用特殊的屬性size或size()函數來測試集合的大小:

  1. from eg.Cat cat where cat.kittens.size > 0  
  2.  
  3. from eg.Cat cat where size(cat.kittens) > 0  

·  對于有索引的集合,你可以使用特殊屬性minIndex和maxIndex來引用最小索引和***索引。同樣,你也可以使用minElement和maxElement來引用基本類型的集合的minimum和maximum元素。

  1. from Calendar cal where cal.holidays.maxElement > current date 

也可以是函數的形式:

  1. from Order order where maxindex(order.items) > 100  
  2.  
  3. from Order order where minelement(order.items) > 10000  

在傳遞索引和元素給集合時(elements and indices函數)和傳遞子查詢的結果集時,SQL函數any, some, all, exists, in都是被支持的:

  1. select mother from eg.Cat as mother, eg.Cat as kit  
  2.  
  3. where kit in elements(foo.kittens)  
  4.  
  5. select p from eg.NameList list, eg.Person p  
  6.  
  7. where p.name = some elements(list.names)  
  8.  
  9. from eg.Cat cat where exists elements(cat.kittens)  
  10.  
  11. from eg.Player p where 3 > all elements(p.scores)  
  12.  
  13. from eg.Show show where 'fizard' in indices(show.acts)  

請注意:size, elements, indices, minIndex, maxIndex, minElement, maxElement在使用時有一些限制:

v      where從句中的in只用于數據庫的子查詢。

v      select從句中的in只用于elements 和indices函數。

v      帶有索引的元素的collection(arrays, lists, maps)只能在where從句中通過索引引用:

  1. from Order order where order.items[0].id = 1234  
  2.  
  3. select person from Person person, Calendar calendar  
  4.  
  5. where calendar.holidays['national day'] = person.birthDay  
  6.  
  7.     and person.nationality.calendar = calendar  
  8.  
  9. select item from Item item, Order order 
  10.  
  11. where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11  
  12.  
  13. select item from Item item, Order order 
  14.  
  15. where order.items[ maxindex(order.items) ] = item and order.id = 11  

表達式中的[]的內部可以是一個算術表達式:

  1. select item from Item item, Order order 
  2.  
  3. where order.items[ size(order.items) - 1 ] = item  

HQL為one-to-many關聯和值的集合提供了內置的index()函數:

  1. select item, index(item) from Order order 
  2.  
  3.     join order.items item  
  4.  
  5. where index(item) <  5  

被一些特定數據庫支持的SQL函數可以被使用:

  1. from eg.DomesticCat cat where upper(cat.namelike 'FRI%' 

如果你還不相信上面的一切,那么想想更長的和更短的可讀的查詢吧:

  1. select cust  
  2. from Product prod,  
  3.     Store store  
  4.     inner join store.customers cust  
  5. where prod.name = 'widget' 
  6.     and store.location.name in ( 'Melbourne''Sydney' )  
  7.     and prod = all elements(cust.currentOrder.lineItems) 

提示:something like

  1. SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order  
  2. FROM customers cust,  
  3.     stores store,  
  4.     locations loc,  
  5.     store_customers sc,  
  6.     product prod  
  7. WHERE prod.name = 'widget' 
  8.     AND store.loc_id = loc.id  
  9.     AND loc.name IN ( 'Melbourne''Sydney' )  
  10.     AND sc.store_id = store.id  
  11.     AND sc.cust_id = cust.id  
  12.     AND prod.id = ALL(  
  13.         SELECT item.prod_id  
  14.         FROM line_items item, orders o  
  15.         WHERE item.order_id = o.id  
  16. AND cust.current_order = o.id) 

【編輯推薦】

  1. 使用MyEclipse開發***個Hibernate程序
  2. Hibernate 中Clob字段的使用
  3. Hibernate自動生成標
  4. Hibernate的三個狀態(3)
  5. Hibernate的三個狀態(2)
責任編輯:book05 來源: 百度博客
相關推薦

2024-12-31 06:00:00

Python編程代碼

2009-06-18 09:14:08

Hibernate H

2025-06-19 02:00:00

云安全云計算CISO

2016-03-10 10:07:22

設計首頁開發

2009-09-23 18:05:48

2011-05-26 16:04:17

java

2011-07-11 17:56:04

java

2016-10-28 16:53:03

數據庫

2009-01-20 10:27:00

2016-03-17 10:29:03

NoSQL數據整合系統集成

2009-10-27 13:34:56

Oracle密碼管理

2024-02-27 07:12:12

編程語言TS

2009-09-25 16:57:49

Hibernate查詢

2022-01-05 09:26:56

IT災難IT故障

2016-03-22 10:35:05

移動·開發技術周刊

2017-08-15 15:18:43

混合云云服務商管理

2016-12-02 16:25:09

數據中心模塊化

2017-11-10 06:31:40

液冷管路連接機房

2015-01-29 09:11:37

OpenStack云應用云部署

2009-06-12 15:32:01

Hibernate H
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区免费视频 | 精品视频一区二区三区在线观看 | 中文字幕在线看第二 | 男女污网站 | 日日爱视频 | 高清免费av | 欧美一二三四成人免费视频 | 欧美中文在线 | 欧美视频福利 | 日韩国产一区二区三区 | 成人小视频在线观看 | 成人性生交大片免费看r链接 | 国产精品视频一二三 | 在线日韩不卡 | 毛片黄片 | 精品日韩在线 | 欧美一区二区三区精品免费 | 日本久久精 | 日本三级日产三级国产三级 | 日韩黄色av | 久久久网 | 一区二区三区精品视频 | 天天干狠狠 | 国产精品永久免费视频 | 成av在线 | 国产成人一区二 | 伊人看片 | 久久三区 | 天天澡天天狠天天天做 | 一区二区三区精品视频 | 欧美888 | 国产精品一区久久久 | www一级片 | 五月激情综合 | 亚洲精品9999 | 日本不卡一区二区三区 | 超碰在线人人干 | 黄色大片免费网站 | 久久久久国产一区二区三区 | 国产精品久久久久久久久久免费看 | 天堂综合 |