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

教你使用Hibernate的QBC查詢

開(kāi)發(fā) 后端
本篇文章教你使用Hibernate的QBC查詢。QBC查詢就是通過(guò)使用Hibernate提供的Query By Criteria API來(lái)查詢對(duì)象,這種API封裝了SQL語(yǔ)句的動(dòng)態(tài)拼裝,對(duì)查詢提供了更加面向?qū)ο蟮墓δ芙涌凇?/div>

QBC查詢就是通過(guò)使用Hibernate提供的Query By Criteria API來(lái)查詢對(duì)象,這種API封裝了SQL語(yǔ)句的動(dòng)態(tài)拼裝,對(duì)查詢提供了更加面向?qū)ο蟮墓δ芙涌凇N覀兛聪旅娴氖纠绦颍?

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.add(Expression.eq(“name”,”zx”));   
  3. criteria.add(Expression.eq(“age”,new Integer(27));   
  4. List list=criteria.list();  

當(dāng)執(zhí)行criteria.list()時(shí)會(huì)生成類似這樣的SQL語(yǔ)句:

  1. Select * from user where name=’zx’   
  2. and   
  3. age=27; 

所以在這里我們可以看出,Criteria實(shí)際上是一個(gè)查詢?nèi)萜鳎鼘?duì)查詢條件表達(dá)式的添加進(jìn)行了封裝,具體的查詢條件是通過(guò)add()方法添加的,而且具體的查詢條件的表達(dá)式運(yùn)算是通過(guò)Expression指定的。Hibernate在運(yùn)行期會(huì)根據(jù)Criteria指定的表達(dá)式條件來(lái)添加查詢條件,并且生成查詢語(yǔ)句。這種方式非常符合Java以及所有面向?qū)ο缶幊陶Z(yǔ)言的編程方式,所以大多數(shù)的持久層框架都提供了對(duì)這種方式查詢的支持。下面我們講解這種查詢方式的各個(gè)技術(shù)細(xì)節(jié)。

1、Criteria查詢表達(dá)式:

正如我們所見(jiàn),Expression對(duì)查詢語(yǔ)句的表達(dá)式進(jìn)行了封裝和限制,下表列出了Expression所有的方法,以及每個(gè)方法所對(duì)應(yīng)的查詢表達(dá)式及其限制。

方法描述
Expression.eq對(duì)應(yīng)SQL的“field=value”表達(dá)式
如:Expression.eq(“name”,”zx”);
Expression.allEq方法的參數(shù)為一個(gè)Map類型對(duì)象,包含多個(gè)名/值對(duì)對(duì)應(yīng)關(guān)系,相當(dāng)于多個(gè)Expression.eq的疊加
Expression.gt對(duì)應(yīng)SQL的“field>value”表達(dá)式
Expression.ge對(duì)應(yīng)SQL的“field>=value”表達(dá)式
Expression.lt對(duì)應(yīng)SQL的“field”表達(dá)式
Expression.le對(duì)應(yīng)SQL的“field< =value”表達(dá)式
Expression.between對(duì)應(yīng)SQL語(yǔ)句的between表達(dá)式,如:查詢年齡在21與27歲之間的用戶,可以寫成Expression.between(“age”,new
Integer(21),new Integer(27));
Expression.like對(duì)應(yīng)SQL語(yǔ)句的”field like value”表達(dá)式
Expression.in對(duì)應(yīng)SQL語(yǔ)句的“field in(……)”表達(dá)式
Expression.eqProperty用于比較兩個(gè)屬性值,對(duì)應(yīng)”field=field”SQL表達(dá)式
Expression.gtProperty用于比較兩個(gè)屬性值,對(duì)應(yīng)”field>field”SQL表達(dá)式
Expression.geProperty用于比較兩個(gè)屬性值,對(duì)應(yīng)”field>=field”SQL表達(dá)式
Expression.ltProperty用于比較兩個(gè)屬性值,對(duì)應(yīng)”field表達(dá)式
Expression.leProperty用于比較兩個(gè)屬性值,對(duì)應(yīng)”field< =field”SQL表達(dá)式
Expression.and對(duì)應(yīng)SQL語(yǔ)句的And關(guān)系組合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
Expression.or對(duì)應(yīng)SQL語(yǔ)句的Or關(guān)系組合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
Expression.sql作為補(bǔ)充這個(gè)方法提供了原生SQL語(yǔ)句查詢的支持,在執(zhí)行時(shí)直接通過(guò)原生SQL語(yǔ)句進(jìn)行限定,如:Expression.sql(“l(fā)ower({alias}.name)
like (?)”,“zhao%”,Hibernate.STRING) ;在運(yùn)行時(shí){ alias
}將會(huì)由當(dāng)前查詢所關(guān)聯(lián)的實(shí)體類名替換,()中的?將會(huì)由”zhao%”替換,并且類型由Hibernate.STRING指定。

注意:Expression各方法中的屬性參數(shù)(各方法中的***個(gè)參數(shù))所指定的屬性名稱(如:name,sex),并不是數(shù)據(jù)庫(kù)表中的實(shí)際字段名稱,而是實(shí)體對(duì)象中映射實(shí)際數(shù)據(jù)表字段的類屬性名稱。
 
2、示例查詢:

示例查詢是通過(guò)Example類來(lái)完成的,Example類實(shí)現(xiàn)了Criterion接口,可以用作Criteria查詢條件,Example類的作用是:根據(jù)已有對(duì)象,查詢屬性值與之相同的其他對(duì)象。如下代碼所示:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. User exampleuser=new User(“zx”);   
  3. criteria.add(Example.create(exampleuser));   
  4. List list=criteria.list();   
  5. for(int i=0;i   
  6. User user=(User)list.get(i);   
  7. System.out.println(user.getName()+”\n”);   
  8. }  

上述代碼中User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));兩句相當(dāng)于criteria.add(Expression.eq(“name”,”zx”));因此會(huì)生成類似如下的SQL語(yǔ)句:

  1. select * from user where name=’zx’; 

在上面的代碼中exampleuser稱為示例對(duì)象。
 
在Hibernate中隊(duì)示例查詢,默認(rèn)情況下會(huì)排除掉示例對(duì)象中屬性值為空的屬性,還可以調(diào)用Example.excludeNone(排除空串值)/excludeZeros(排除零值),或者調(diào)用Example.excludeProperty方法來(lái)指定排除特定屬性。

示例查詢主要應(yīng)用于組合查詢中,比如根據(jù)用戶輸入的查詢條件動(dòng)態(tài)生成最終的查詢語(yǔ)句,通過(guò)使用示例查詢,可以避免由于查詢條件過(guò)多而寫的大量if判斷語(yǔ)句。

3、復(fù)合查詢:

復(fù)合查詢主要是處理,具有關(guān)聯(lián)關(guān)系的兩個(gè)實(shí)體怎樣進(jìn)行關(guān)聯(lián)查詢,比如User實(shí)體對(duì)象與Addres實(shí)體對(duì)象具有一對(duì)多的關(guān)聯(lián)關(guān)系,我們可以如下構(gòu)造符合查詢:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. Criteria addcriteria=criteria.createCriteria(“addresses”);(1)   
  3. addcriteria.add(Express.like(“address”,”%tianjin%”));   
  4.   List list=criteria.list();   
  5. for(int i=0;i   
  6.   User user=(User)list.get(i);   
  7.   System.out.println(user.getName()+”\n”);   
  8.   Set addresses=user.getAddresses();   
  9.   Iterator it=addresses.iterator();   
  10.   while(it.hasNext(){   
  11. Address address=(Address)it.next();   
  12. System.out.println(address.getAddress()+”\n”);   
  13.   }   
  14. }  

當(dāng)執(zhí)行到了(1)處時(shí),表明要針對(duì)User對(duì)象的addresses屬性添加新的查詢條件,因此當(dāng)執(zhí)行criteria.list()時(shí),Hibernate會(huì)生成類似如下的SQL語(yǔ)句:

  1. Select * from user inner join address on user.id=address.id where   
  2. address.address like ‘%shanghai%’;  

正如我們所見(jiàn),我們可以通過(guò)向Criteria中添加保存關(guān)聯(lián)對(duì)象的集合屬性(addresses屬性保存與User對(duì)象相關(guān)聯(lián)的Address對(duì)象),來(lái)構(gòu)造復(fù)合查詢,在數(shù)據(jù)庫(kù)一端是通過(guò)內(nèi)連接查詢來(lái)實(shí)現(xiàn)。

4、Criteria的高級(jí)特性:

A、限定返回記錄條數(shù):

我們可以通過(guò)利用Criteria.setFirstResult/setMaxResult方法來(lái)限定返回某一次查詢的記錄數(shù),如下代碼:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.setFirstResult(100);   
  3. criteria.setMaxResult(200);  

通過(guò)以上代碼可以設(shè)定該次查詢返回user表中的從第100條記錄開(kāi)始直到第200條記錄結(jié)束的100條記錄。

B、對(duì)查詢結(jié)果進(jìn)行排序:

可通過(guò)使用net.sf.hibernate.expression.Order類可以對(duì)查詢結(jié)果集進(jìn)行排序,如下面代碼:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.add(Expression.eq(“groupid”,”2”);   
  3. criteria.addOrder(Order.asc(“name”));   
  4. criteria.addOrder(Order.desc(“groupid”));   
  5. List list=criteria.list();  

通過(guò)使用Order類的asc()/desc()方法,可以指定針對(duì)某個(gè)字段的排序邏輯,如果執(zhí)行上述代碼,會(huì)生成類似如下的SQL語(yǔ)句:

  1. Select * from user where groupid=’2’ order by name asc,groupid desc  

C、分組與統(tǒng)計(jì):

在Hibernate3中,對(duì)Criteria又增添了新功能,可以支持分組與統(tǒng)計(jì)功能,在Hibernate3中增加了Projections以及ProjectionList類,這兩個(gè)類對(duì)分組與統(tǒng)計(jì)功能進(jìn)行了封裝,如下代碼:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.setProjection(Projections.groupProperty(“age”));(1)   
  3. List list=criteria.list();   
  4. Iterator it=list.iterator();   
  5. while(it.hasNext()){   
  6.  System.out.println(it.next());   
  7. }  

通過(guò)(1)處的代碼,我們通過(guò)Projections類指定了用于分組的目標(biāo)屬性,當(dāng)進(jìn)行檢索時(shí)Hibernate會(huì)生成類似如下的SQL語(yǔ)句:

  1. Select age from user group by age;  

還可以通過(guò)使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法來(lái)實(shí)現(xiàn)統(tǒng)計(jì)功能,如下面的代碼示例:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.setProjection(Projections.avg(“age”));(1)   
  3. List list=criteria.list();   
  4. Iterator it=list.iterator();   
  5. while(it.hasNext()){   
  6.  System.out.println(it.next());   
  7. }  

通過(guò)(1)處的代碼,我們實(shí)現(xiàn)了對(duì)用戶平均年齡的統(tǒng)計(jì),當(dāng)進(jìn)行檢索時(shí),Hibernate會(huì)生成類似如下的SQL語(yǔ)句:

  1. Select avg(age) from user;  

另外,在SQL語(yǔ)句中的多條件分組與統(tǒng)計(jì)功能,可以利用ProjectionList類來(lái)實(shí)現(xiàn),如下面代碼所示:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. ProjectionList prolist=Projections.projectionList();   
  3. prolist.add(Projections.groupProperty(“age”));   
  4. prolist.add(Projections.rowCount());   
  5. criteria.setProjection(prolist);   
  6. List list=criteria.list();  

通過(guò)以上代碼,實(shí)現(xiàn)了對(duì)不同年齡人員數(shù)量的分組統(tǒng)計(jì),當(dāng)進(jìn)行檢索時(shí),Hibernate會(huì)生成類似如下的SQL語(yǔ)句:

  1. Select age,count(*) from user group by age;  

5、DetachedCriteria:

在Hibernate2中,Criteria實(shí)例是與創(chuàng)建它的Session實(shí)例具有相同的生命周期的,也就是說(shuō),Session實(shí)例是它所創(chuàng)建的Criteria實(shí)例的宿主,當(dāng)Session關(guān)閉時(shí),寄生于Session實(shí)例的Criteria都將失效。這就對(duì)Criteria的重用造成了困難,為了實(shí)現(xiàn)Criteria實(shí)例的重用,在Hibernate3中提供了一個(gè)DetachedCriteria類,DetachedCriteria實(shí)例的生命周期與Session實(shí)例的生命周期無(wú)關(guān),我們可以利用DetachedCriteria對(duì)一些常用的Criteria查詢條件進(jìn)行抽離,當(dāng)需要進(jìn)行檢索時(shí)再與Session實(shí)例關(guān)聯(lián),從而獲得運(yùn)行期的Criteria實(shí)例。如下面的代碼所示:

  1. DetachedCriteria dc= DetachedCriteria.forClass(User.class);   
  2. dc.add(Expression.eq(“name”,”zhaoxin”));   
  3. dc.add(Expression.eq(“sex”,”1”));   
  4. Criteria criteria=dc.getExecutableCriteria(session);   
  5. Iterator it=criteria.list().iterator();   
  6. while(it.hasNext()){   
  7.   User user=(User)it.next();   
  8.   System.out.println(user.getName());   
  9. }  

正如我們所見(jiàn),DetachedCriteria的生存周期與session實(shí)例無(wú)關(guān),當(dāng)需要進(jìn)行檢索時(shí),通過(guò)getExecutableCriteria(session)方法,與當(dāng)前的Session實(shí)例關(guān)聯(lián)并獲得運(yùn)行期的Criteria實(shí)例,完成檢索。

DetachedCriteria也可以用于完成子查詢功能,如下代碼所示:

  1. DetachedCriteria dc= DetachedCriteria.forClass(User.class);   
  2. dc.setProjection(Projections.avg(“age”));   
  3. Criteria criteria=session.createCriteria(User.class);   
  4. criteria.add(Subqueries.propertyGt(“age”,dc));   
  5. List list=criteria.list(); 

通過(guò)Subqueries類,實(shí)現(xiàn)了添加子查詢的功能,我們將DetachedCriteria所設(shè)定的查詢條件,當(dāng)作子查詢添加到了運(yùn)行時(shí)Criteria實(shí)例的查詢條件中,當(dāng)執(zhí)行檢索時(shí)Hibernate會(huì)生成類似如下的SQL語(yǔ)句:

  1. Select * from user where age>(select avg(age) from user group by age); 

【編輯推薦】

  1. Hibernate的三個(gè)狀態(tài)(1)
  2. Hibernate 中Clob字段的使用
  3. Hibernate自動(dòng)生成標(biāo)
  4. Hibernate的三個(gè)狀態(tài)(3)
  5. Hibernate的三個(gè)狀態(tài)(2)
責(zé)任編輯:book05 來(lái)源: 百度博客
相關(guān)推薦

2009-09-23 18:05:48

2009-09-24 15:27:41

Hibernate查詢

2009-09-23 13:04:58

HibernateOracle sequ

2009-06-30 16:55:19

2009-06-08 10:20:01

Hibernate查詢

2009-06-26 10:01:00

Hibernate的查

2009-09-23 09:16:25

Hibernate復(fù)合

2009-09-23 10:14:22

Hibernate

2009-09-22 15:26:30

Hibernate多表

2009-06-17 14:17:40

Criteria條件查Hibernate

2009-06-17 08:47:00

Hibernate優(yōu)化

2009-09-22 08:39:59

Hibernate F

2009-06-18 09:14:08

Hibernate H

2009-09-27 10:19:11

Hibernate命名

2009-09-29 16:29:40

Hibernate查詢

2009-06-18 09:47:50

2009-06-29 09:00:42

Hibernate的Q

2009-09-21 13:42:47

Hibernate查詢

2009-06-25 16:45:31

Hibernate

2009-06-30 16:46:45

Criteria進(jìn)階查
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久久久亚洲 | 自拍偷拍亚洲欧美 | 国产线视频精品免费观看视频 | 亚洲成av人片在线观看无码 | 久久综合久久久 | 羞羞视频网站 | 久在线| 日韩网站在线观看 | 久在线 | 日韩电影免费在线观看中文字幕 | 日韩综合网| 久久精品一区 | 麻豆精品国产91久久久久久 | 国产精品久久久久久久久久免费看 | 精品国产乱码久久久久久牛牛 | 国产九九九九 | 国产偷录视频叫床高潮对白 | 日韩一区二区在线视频 | 日韩在线一区二区 | 久久最新精品视频 | av中文字幕在线 | 日韩精品一区二区三区中文在线 | 国产91丝袜在线18 | 久色激情 | 精品在线99 | 久草视频在线播放 | 五月婷婷丁香 | 自拍偷拍一区二区三区 | 欧美精品一区二区三区在线四季 | 欧美日韩电影一区二区 | 欧美精品91爱爱 | 亚洲女人的天堂 | 夜久久 | 一区二区三区视频在线免费观看 | 精品日韩一区二区 | 天天操精品视频 | 中文字幕在线视频观看 | 中文字幕日韩欧美一区二区三区 | 欧美日韩成人 | 久久大陆 | 亚洲天堂免费 |