日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Hibernate查詢(xún)快速入門(mén)

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

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

執(zhí)行查詢(xún)

HQL和原生SQL(native SQL)查詢(xún)要通過(guò)為org.hibernate.Query的實(shí)例來(lái)表達(dá)。 這個(gè)接口提供了參數(shù)綁定、結(jié)果集處理以及運(yùn)行實(shí)際查詢(xún)的方法。 你總是可以通過(guò)當(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. List mothers = session.createQuery(
  6.     "select mother from Cat as cat join cat.mother as mother where cat.name = ?")
  7.     .setString(0, name)
  8.     .list();
  9. List kittens = session.createQuery(
  10.     "from Cat as cat where cat.mother = ?")
  11.     .setEntity(0, pk)
  12.     .list();
  13. Cat mother = (Cat) session.createQuery(
  14.     "select cat.mother from Cat as cat where cat = ?")
  15.     .setEntity(0, izi)
  16.     .uniqueResult();]]
  17. Query mothersWithKittens = (Cat) session.createQuery(
  18.     "select mother from Cat as mother left join fetch mother.kittens");
  19. Set uniqueMothers = new HashSet(mothersWithKittens.list());

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

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

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

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

(譯注:元組(tuples)指一條結(jié)果行包含多個(gè)對(duì)象) Hibernate查詢(xún)有時(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. while ( kittensAndMothers.hasNext() ) {
  6.     Object[] tuple = (Object[]) kittensAndMothers.next();
  7.     Cat kitten  = tuple[0];
  8.     Cat mother  = tuple[1];
  9.     ....
  10. }

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

查詢(xún)可在select從句中指定類(lèi)的屬性,甚至可以調(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.     .....
  13. }

4. 綁定參數(shù)

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

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

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

它們本身是自我說(shuō)明的

 
 
 
  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. 分頁(yè)

如果你需要指定結(jié)果集的范圍(希望返回的***行數(shù)/或開(kāi)始的行數(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è)有限定條件的查詢(xún)轉(zhuǎn)換成你的數(shù)據(jù)庫(kù)的原生SQL(native SQL)。

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

如果你的JDBC驅(qū)動(dòng)支持可滾動(dòng)的ResuleSet,Query接口可以使用ScrollableResults,允許你在查詢(xún)結(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.     // find the first name on each page of an alphabetical list of cats by name
  6.     firstNamesOfPages = new ArrayList();
  7.     do {
  8.         String name = cats.getString(0);
  9.         firstNamesOfPages.add(name);
  10.     }
  11.     while ( cats.scroll(PAGE_SIZE) );
  12.     // Now get the first page of cats
  13.     pageOfCats = new ArrayList();
  14.     cats.beforeFirst();
  15.     int i=0;
  16.     while( ( PAGE_SIZE > i++ ) && cats.next() ) pageOfCats.add( cats.get(1) );
  17. }
  18. cats.close()

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

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

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

參數(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í)際的程序代碼與所用的查詢(xún)語(yǔ)言無(wú)關(guān),你也可在元數(shù)據(jù)中定義原生SQL(native SQL)查詢(xún), 或?qū)⒃械钠渌牟樵?xún)語(yǔ)句放在配置文件中,這樣就可以讓Hibernate統(tǒng)一管理,達(dá)到遷移的目的。

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


分享文章:Hibernate查詢(xún)快速入門(mén)
文章出自:http://www.dlmjj.cn/article/dpghcio.html