自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hibernate查詢快速入門

開發(fā) 后端
Hibernate查詢支持強(qiáng)大且易于使用的面向?qū)ο蟛樵冋Z言(HQL)。 如果希望通過編程的方式創(chuàng)建查詢,Hibernate提供了完善的按條件(Query By Criteria, QBC)以及按樣例(Query By Example, QBE)進(jìn)行Hibernate查詢的功能。

如果不知道所要尋找的對(duì)象的持久化標(biāo)識(shí),那么你需要使用Hibernate查詢。在這里拿出來和大家分享一下我的經(jīng)驗(yàn),希望對(duì)大家有用。

Hibernate支持強(qiáng)大且易于使用的面向?qū)ο蟛樵冋Z言(HQL)。 如果希望通過編程的方式創(chuàng)建查詢,Hibernate提供了完善的按條件(Query By Criteria, QBC)以及按樣例(Query By Example, QBE)進(jìn)行Hibernate查詢的功能。 你也可以用原生SQL(native SQL)描述Hibernate查詢,Hibernate額外提供了將結(jié)果集(result set)轉(zhuǎn)化為對(duì)象的支持。

執(zhí)行查詢

HQL和原生SQL(native SQL)查詢要通過為org.hibernate.Query的實(shí)例來表達(dá)。 這個(gè)接口提供了參數(shù)綁定、結(jié)果集處理以及運(yùn)行實(shí)際查詢的方法。 你總是可以通過當(dāng)前Session獲取一個(gè)Query對(duì)象:

  1. List cats = session.createQuery(  
  2.     "from Cat as cat where cat.birthdate < ?")  
  3.     .setDate(0, date)  
  4.     .list();  
  5.  
  6. List mothers = session.createQuery(  
  7.     "select mother from Cat as cat join cat.mother as mother where cat.name = ?")  
  8.     .setString(0, name)  
  9.     .list();  
  10.  
  11. List kittens = session.createQuery(  
  12.     "from Cat as cat where cat.mother = ?")  
  13.     .setEntity(0, pk)  
  14.     .list();  
  15.  
  16. Cat mother = (Cat) session.createQuery(  
  17.     "select cat.mother from Cat as cat where cat = ?")  
  18.     .setEntity(0, izi)  
  19.     .uniqueResult();]]  
  20.  
  21. Query mothersWithKittens = (Cat) session.createQuery(  
  22.     "select mother from Cat as mother left join fetch mother.kittens");  
  23. Set uniqueMothers = new HashSet(mothersWithKittens.list()); 

一個(gè)查詢通常在調(diào)用list()時(shí)被執(zhí)行,執(zhí)行結(jié)果會(huì)完全裝載進(jìn)內(nèi)存中的一個(gè)集合(collection)。 查詢返回的對(duì)象處于持久(persistent)狀態(tài)。如果你知道的查詢只會(huì)返回一個(gè)對(duì)象,可使用list()的快捷方式uniqueResult()。 注意,使用集合預(yù)先抓取的查詢往往會(huì)返回多次根對(duì)象(他們的集合類都被初始化了)。你可以通過一個(gè)集合來過濾這些重復(fù)對(duì)象。

1. 迭代式獲取結(jié)果(Iterating results)

某些情況下,你可以使用iterate()方法得到更好的性能。 這通常是你預(yù)期返回的結(jié)果在session,或二級(jí)緩存(second-level cache)中已經(jīng)存在時(shí)的情況。 如若不然,iterate()會(huì)比list()慢,而且可能簡(jiǎn)單查詢也需要進(jìn)行多次數(shù)據(jù)庫訪問: iterate()會(huì)首先使用1條語句得到所有對(duì)象的持久化標(biāo)識(shí)(identifiers),再根據(jù)持久化標(biāo)識(shí)執(zhí)行n條附加的select語句實(shí)例化實(shí)際的對(duì)象。

  1. // fetch ids  
  2. Iterator iter = sess.createQuery("from eg.Qux q order by q.likeliness").iterate();  
  3. while ( iter.hasNext() ) {  
  4.     Qux qux = (Qux) iter.next();  // fetch the object  
  5.     // something we couldnt express in the query  
  6.     if ( qux.calculateComplicatedAlgorithm() ) {  
  7.         // delete the current instance  
  8.         iter.remove();  
  9.         // dont need to process the rest  
  10.         break;  
  11.     }  

2. 返回元組(tuples)的查詢

(譯注:元組(tuples)指一條結(jié)果行包含多個(gè)對(duì)象) Hibernate查詢有時(shí)返回元組(tuples),每個(gè)元組(tuples)以數(shù)組的形式返回:

  1. Iterator kittensAndMothers = sess.createQuery(  
  2.             "select kitten, mother from Cat kitten join kitten.mother mother")  
  3.             .list()  
  4.             .iterator();  
  5.  
  6. while ( kittensAndMothers.hasNext() ) {  
  7.     Object[] tuple = (Object[]) kittensAndMothers.next();  
  8.     Cat kitten  = tuple[0];  
  9.     Cat mother  = tuple[1];  
  10.     ....  

3. 標(biāo)量(Scalar)結(jié)果

查詢可在select從句中指定類的屬性,甚至可以調(diào)用SQL統(tǒng)計(jì)(aggregate)函數(shù)。 屬性或統(tǒng)計(jì)結(jié)果被認(rèn)定為"標(biāo)量(Scalar)"的結(jié)果(而不是持久(persistent state)的實(shí)體)。

 

  1. Iterator results = sess.createQuery(  
  2.         "select cat.color, min(cat.birthdate), count(cat) from Cat cat " +  
  3.         "group by cat.color")  
  4.         .list()  
  5.         .iterator();  
  6.           
  7. while ( results.hasNext() ) {  
  8.     Object[] row = (Object[]) results.next();  
  9.     Color type = (Color) row[0];  
  10.     Date oldest = (Date) row[1];  
  11.     Integer count = (Integer) row[2];  
  12.     .....  

4. 綁定參數(shù)

接口Query提供了對(duì)命名參數(shù)(named parameters)、JDBC風(fēng)格的問號(hào)(?)參數(shù)進(jìn)行綁定的方法。 不同于JDBC,Hibernate對(duì)參數(shù)從0開始計(jì)數(shù)。 命名參數(shù)(named parameters)在查詢字符串中是形如:name的標(biāo)識(shí)符。 命名參數(shù)(named parameters)的優(yōu)點(diǎn)是:

命名參數(shù)(named parameters)與其在查詢串中出現(xiàn)的順序無關(guān)

它們可在同一查詢串中多次出現(xiàn)

它們本身是自我說明的

  1. //named parameter (preferred)  
  2. Query q = sess.createQuery("from DomesticCat cat where cat.name = :name");  
  3. q.setString("name", "Fritz");  
  4. Iterator cats = q.iterate();  
  5. //positional parameter  
  6. Query q = sess.createQuery("from DomesticCat cat where cat.name = ?");  
  7. q.setString(0, "Izi");  
  8. Iterator cats = q.iterate();  
  9. //named parameter list  
  10. List names = new ArrayList();  
  11. names.add("Izi");  
  12. names.add("Fritz");  
  13. Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)");  
  14. q.setParameterList("namesList", names);  
  15. List cats = q.list();  

5. 分頁

如果你需要指定結(jié)果集的范圍(希望返回的***行數(shù)/或開始的行數(shù)),應(yīng)該使用Query接口提供的方法:

  1. Query q = sess.createQuery("from DomesticCat cat");  
  2. q.setFirstResult(20);  
  3. q.setMaxResults(10);  
  4. List cats = q.list(); 

Hibernate 知道如何將這個(gè)有限定條件的查詢轉(zhuǎn)換成你的數(shù)據(jù)庫的原生SQL(native SQL)。

6. 可滾動(dòng)遍歷(Scrollable iteration)

如果你的JDBC驅(qū)動(dòng)支持可滾動(dòng)的ResuleSet,Query接口可以使用ScrollableResults,允許你在查詢結(jié)果中靈活游走。

  1. Query q = sess.createQuery("select cat.name, cat from DomesticCat cat " +  
  2.                             "order by cat.name");  
  3. ScrollableResults cats = q.scroll();  
  4. if ( cats.first() ) {  
  5.  
  6.     // find the first name on each page of an alphabetical list of cats by name  
  7.     firstNamesOfPages = new ArrayList();  
  8.     do {  
  9.         String name = cats.getString(0);  
  10.         firstNamesOfPages.add(name);  
  11.     }  
  12.     while ( cats.scroll(PAGE_SIZE) );  
  13.  
  14.     // Now get the first page of cats  
  15.     pageOfCats = new ArrayList();  
  16.     cats.beforeFirst();  
  17.     int i=0;  
  18.     while( ( PAGE_SIZE > i++ ) && cats.next() ) pageOfCats.add( cats.get(1) );  
  19.  
  20. }  
  21. cats.close() 

請(qǐng)注意,使用此功能需要保持?jǐn)?shù)據(jù)庫連接(以及游標(biāo)(cursor))處于一直打開狀態(tài)。 如果你需要斷開連接使用分頁功能,請(qǐng)使用setMaxResult()/setFirstResult()

7. 外置命名查詢(Externalizing named queries)

你可以在映射文件中定義命名查詢(named queries)。 (如果你的查詢串中包含可能被解釋為XML標(biāo)記(markup)的字符,別忘了用CDATA包裹起來。)

參數(shù)綁定及執(zhí)行以編程方式(programatically)完成:

  1. Query q = sess.getNamedQuery("ByNameAndMaximumWeight");  
  2. q.setString(0, name);  
  3. q.setInt(1, minWeight);  
  4. List cats = q.list(); 

請(qǐng)注意實(shí)際的程序代碼與所用的查詢語言無關(guān),你也可在元數(shù)據(jù)中定義原生SQL(native SQL)查詢, 或?qū)⒃械钠渌牟樵冋Z句放在配置文件中,這樣就可以讓Hibernate統(tǒng)一管理,達(dá)到遷移的目的。

也請(qǐng)注意在元素中聲明的查詢必須有一個(gè)全局唯一的名字,而在元素中聲明的查詢自動(dòng)具有全局名,是通過類的全名加以限定的。比如eg.Cat.ByNameAndMaximumWeight。

【編輯推薦】

  1. 淺析Hibernate VO與PO區(qū)別
  2. Hibernate中merge()方法解析
  3. Hibernate中Criteria攻略詳解
  4. 簡(jiǎn)述Hibernate部分查詢語言(一)
  5. 簡(jiǎn)述Hibernate三種查詢的應(yīng)用
責(zé)任編輯:仲衡 來源: javanb
相關(guān)推薦

2009-09-23 11:21:32

學(xué)習(xí)Hibernate

2009-09-25 13:48:17

Hibernate i

2009-06-02 14:46:26

Hibernate關(guān)系映射教程

2009-09-27 10:19:11

Hibernate命名

2009-09-29 16:29:40

Hibernate查詢

2009-06-18 09:47:50

2009-06-25 16:52:34

2009-09-24 15:03:30

Hibernate配置

2014-05-12 10:37:41

2009-06-17 08:47:00

Hibernate優(yōu)化

2009-06-18 09:14:08

Hibernate H

2009-06-26 10:01:00

Hibernate的查

2009-09-22 08:39:59

Hibernate F

2015-10-29 15:36:19

Redis入門

2009-09-24 10:35:10

Hibernate查詢

2009-06-30 16:44:10

Criteria基本查

2009-06-11 14:40:59

Hibernate分頁Hibernate查詢

2009-06-30 14:02:00

hibernate入門MyEclipse開發(fā)

2009-06-30 16:46:45

Criteria進(jìn)階查

2009-09-25 13:39:40

Hibernate屬性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)