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

Hibernate查詢快速入門

開發 后端
Hibernate查詢支持強大且易于使用的面向對象查詢語言(HQL)。 如果希望通過編程的方式創建查詢,Hibernate提供了完善的按條件(Query By Criteria, QBC)以及按樣例(Query By Example, QBE)進行Hibernate查詢的功能。

如果不知道所要尋找的對象的持久化標識,那么你需要使用Hibernate查詢。在這里拿出來和大家分享一下我的經驗,希望對大家有用。

Hibernate支持強大且易于使用的面向對象查詢語言(HQL)。 如果希望通過編程的方式創建查詢,Hibernate提供了完善的按條件(Query By Criteria, QBC)以及按樣例(Query By Example, QBE)進行Hibernate查詢的功能。 你也可以用原生SQL(native SQL)描述Hibernate查詢,Hibernate額外提供了將結果集(result set)轉化為對象的支持。

執行查詢

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

  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()); 

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

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

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

  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)指一條結果行包含多個對象) Hibernate查詢有時返回元組(tuples),每個元組(tuples)以數組的形式返回:

  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. 標量(Scalar)結果

查詢可在select從句中指定類的屬性,甚至可以調用SQL統計(aggregate)函數。 屬性或統計結果被認定為"標量(Scalar)"的結果(而不是持久(persistent state)的實體)。

 

  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. 綁定參數

接口Query提供了對命名參數(named parameters)、JDBC風格的問號(?)參數進行綁定的方法。 不同于JDBC,Hibernate對參數從0開始計數。 命名參數(named parameters)在查詢字符串中是形如:name的標識符。 命名參數(named parameters)的優點是:

命名參數(named parameters)與其在查詢串中出現的順序無關

它們可在同一查詢串中多次出現

它們本身是自我說明的

  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. 分頁

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

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

Hibernate 知道如何將這個有限定條件的查詢轉換成你的數據庫的原生SQL(native SQL)。

6. 可滾動遍歷(Scrollable iteration)

如果你的JDBC驅動支持可滾動的ResuleSet,Query接口可以使用ScrollableResults,允許你在查詢結果中靈活游走。

  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() 

請注意,使用此功能需要保持數據庫連接(以及游標(cursor))處于一直打開狀態。 如果你需要斷開連接使用分頁功能,請使用setMaxResult()/setFirstResult()

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

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

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

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

請注意實際的程序代碼與所用的查詢語言無關,你也可在元數據中定義原生SQL(native SQL)查詢, 或將原有的其他的查詢語句放在配置文件中,這樣就可以讓Hibernate統一管理,達到遷移的目的。

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

【編輯推薦】

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

2009-09-23 11:21:32

學習Hibernate

2009-09-25 13:48:17

Hibernate i

2009-06-02 14:46:26

Hibernate關系映射教程

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

2014-05-12 10:37:41

2009-09-24 15:03:30

Hibernate配置

2009-06-17 08:47:00

Hibernate優化

2009-09-22 08:39:59

Hibernate F

2009-06-26 10:01:00

Hibernate的查

2009-06-18 09:14:08

Hibernate H

2015-10-29 15:36:19

Redis入門

2009-06-30 16:44:10

Criteria基本查

2009-09-24 10:35:10

Hibernate查詢

2009-06-11 14:40:59

Hibernate分頁Hibernate查詢

2009-06-30 14:02:00

hibernate入門MyEclipse開發

2009-06-30 16:46:45

Criteria進階查

2009-09-22 11:24:07

Hibernate查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品18hdxxxⅹ在线 | 韩日一区二区 | 精品国产一区二区三区在线观看 | 美女天天操 | 三级黄色片在线观看 | 热久久性 | 精品国产免费一区二区三区演员表 | 99热免费在线 | 国产电影一区二区 | 日韩精品一区二区三区中文在线 | 国产色99精品9i | 九九精品网 | 日韩成人在线视频 | 国产亚洲精品精品国产亚洲综合 | 国产精品国产a | 欧美一级黄视频 | 精品欧美激情在线观看 | 高清一区二区三区 | 日本亚洲一区 | 婷婷去俺也去 | 欧美一区二区在线看 | 日韩美女一区二区三区在线观看 | 成年人免费网站 | 欧美成人一区二区 | 国产精品视频网址 | 国产视频久久久 | 亚洲高清视频在线观看 | 国产精品1区 | 丁香久久 | 国产成人综合在线 | 久久久久久看片 | 久久一区二区av | 国产成人久久 | 国产欧美精品一区二区 | 国产欧美一区二区精品久导航 | 久久久久久国产精品 | 亚洲高清视频在线观看 | 福利视频一区二区 | 国产精品一区二 | 成人久久久久久久久 | 精品欧美一区二区三区久久久 |