国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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編程代碼

2025-12-17 07:00:00

AI數據戰略CIO

2025-06-19 02:00:00

云安全云計算CISO

2009-06-18 09:14:08

Hibernate H

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

2009-09-25 16:57:49

Hibernate查詢

2009-10-27 13:34:56

Oracle密碼管理

2016-03-17 10:29:03

NoSQL數據整合系統集成

2009-01-20 10:27:00

2016-10-28 16:53:03

數據庫

2016-03-22 10:35:05

移動·開發技術周刊

2017-08-15 15:18:43

混合云云服務商管理

2025-08-20 07:00:00

IT領導CIO職業挑戰

2016-12-02 16:25:09

數據中心模塊化

2024-02-27 07:12:12

編程語言TS

2022-01-05 09:26:56

IT災難IT故障

2011-08-17 13:55:25

VoIPPBX
點贊
收藏

51CTO技術棧公眾號

黄色不卡一区| 99久久精品国产毛片| 久久精品亚洲一区| 欧美性xxxx18| 激情婷婷综合网| 成人国产一区| 国产.精品.日韩.另类.中文.在线.播放| 亚洲va久久久噜噜噜久久天堂| 国产精品高潮呻吟久久久久| 久久亚洲精品一区二区| 亚洲资源在线| 久久精品视频中文字幕| 久久国内精品| 久久精品久久久久久国产 免费| 成人午夜视屏| 国产亚洲一区二区三区| 亚洲色成人www永久在线观看 | 国产成人亚洲综合青青| 粉嫩久久久久久久极品| 韩国视频理论视频久久| 国产人妖ts一区二区| 91精品国产91久久久久福利| 美女毛片一区二区三区四区| 色婷婷综合久久久久中文一区二区| 夜夜嗨aⅴ免费视频| 亚洲一二三四久久| 亚洲精品第一区二区三区| 日本在线啊啊| 亚洲激情在线播放| 久草在线新视觉| 日韩国产精品久久久久久亚洲| 久久精品欧美| 男人的j进女人的j一区| 91福利精品视频| 精产国产伦理一二三区| 粉嫩老牛aⅴ一区二区三区| 丝袜美腿美女被狂躁在线观看| 欧美成人伊人久久综合网| 玖玖在线播放| 超在线视频97| 欧美日韩中文一区二区| 久久新电视剧免费观看| 中文字幕第88页| 色综合中文综合网| 欧美性猛片xxxxx免费中国| 成人午夜私人影院| 国产在线视频2019最新视频| 欧美在线资源| 久久国产精品免费观看| 国产精品天美传媒沈樵| 四虎影视在线观看2413| 精品动漫一区二区三区在线观看| 免费亚洲电影| 色婷婷av一区二区三区大白胸| chinese偷拍一区二区三区| 亚洲精品一区中文字幕乱码| jazzjazz国产精品麻豆| 亚洲国产日韩欧美在线99| 传媒在线观看| 粉嫩一区二区三区在线看| 美女网站免费观看视频| 91福利国产成人精品照片| 天天干天天干天天干天天干天天干| 99这里有精品| 国产一区不卡视频| 久久久精品三级| 欧美午夜精品久久久久久人妖| 不卡专区在线| 亚瑟在线精品视频| 在线观看小视频| 一本色道久久综合精品竹菊| 不卡av免费观看| 91九色最新地址| 99欧美精品| 国产精品免费区二区三区观看| 成人午夜av在线| 成人网视频在线观看| 美女视频久久黄| 一区二区三区国产在线| 激情综合网俺也去| 日韩欧美国产系列| 国产女主播在线直播| 国产亚洲成精品久久| 日韩免费一区| 精品久久一二三| 欧美精品日日鲁夜夜添| 久久久久久女乱国产| 亚洲欧美国产77777| 蜜桃麻豆影像在线观看| 91在线看www| 国产一区二区在线| 在线一区高清| 日韩欧美中文字幕在线播放| 日韩精品成人在线观看| 五月天亚洲综合小说网| 国产精品麻豆成人av电影艾秋| 99re视频在线播放| 中文字幕日韩av资源站| 欧洲av不卡| 欧美裸体网站| 色欧美日韩亚洲| 美日韩中文字幕| 欧美xxxxx在线视频| 国产婷婷色综合av蜜臀av| 国产精品久久久久久久免费软件| 成人性生交大片免费看视频r| 国产日韩高清在线| 日本成人三级电影| 日本高清一区| 免费在线欧美视频| 在线国产一级| 欧美亚洲第一区| 国产日产欧美精品一区二区三区| 欧美一级裸体视频| 亚洲人成电影在线| 天堂久久一区| 亚洲欧美日产图| 884aa四虎影成人精品一区| 综合激情视频| 欧洲毛片在线| 日韩av网站电影| 欧美xxx网站| 蜜桃视频在线观看成人| 欧美日韩一区中文字幕| 成人亚洲一区二区| 国产导航在线| 国产精品小说在线| 一区二区三区国产在线| 女人天堂在线| 5g国产欧美日韩视频| 欧美日韩亚洲网| 亚洲字幕久久| 成人不用播放器| 久久精品女人的天堂av| 欧美一级黄色录像| 久久精品国产99| 日韩大片一区二区| 欧美激情aaaa| 亚洲精品少妇30p| 免费看av成人| 亚洲s色大片在线观看| 成人动漫视频在线观看完整版| 欧美三级乱人伦电影| 天堂a√中文在线| 国产精品h在线观看| 欧美日韩激情| 日本福利片在线| 久久精品国产美女| 日韩风俗一区 二区| 99久久婷婷国产综合精品电影 | 日韩欧美你懂的| 国产乱子轮精品视频| 日韩av黄色| 日韩精品视频一二三| 国产精品一区电影| 欧美精品丝袜久久久中文字幕| 久久国产日韩欧美精品| 久久夜夜久久| gogo高清免费视频| 精品国产乱码久久久久| aaa欧美日韩| 日韩欧美天堂| 日产中文字幕在线精品一区| 日韩成人在线播放| 久久一日本道色综合| 久久国产成人精品| 最新国产露脸在线观看| 国产素人在线观看| 国产精品久久久久久久久久久新郎 | 欧美aa在线观看| 精品视频一区二区在线| 91影视免费在线观看| 日韩精品中文字幕久久臀| 最新国产の精品合集bt伙计| 在线视频观看日韩| 欧美大尺度做爰床戏| 欧美专区日韩视频| 国产成人啪免费观看软件| 在线观看av网站永久| 日本高清不卡三区| 欧美大片在线免费观看| 色噜噜久久综合| 99久精品国产| 女人天堂亚洲aⅴ在线观看| 黑人巨大亚洲一区二区久| 浪潮av在线| 欧美少妇一级片| 日韩av免费在线播放| 欧美激情中文字幕一区二区| 日韩欧美中文| 亚洲伦理影院| 国自在线精品视频| 性欧美大战久久久久久久久| 日本不卡视频一二三区| 久久精品色综合| ririsao久久精品一区| 亚洲美女在线免费观看| 国产精品啪啪啪视频| 亚洲va欧美va在线观看| 久久精品成人一区二区三区|