欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Hibernate 復合查詢(xún) - Winbomb - 網(wǎng)易博客
Hibernate 復合查詢(xún)
復合查詢(xún)主要是處理,具有關(guān)聯(lián)關(guān)系的兩個(gè)實(shí)體怎樣進(jìn)行關(guān)聯(lián)查詢(xún),比如User實(shí)體對象與Addres實(shí)體對象具有一對多的關(guān)聯(lián)關(guān)系,我們可以如下構造符合查詢(xún):
Criteria criteria=session.createCriteria(User.class);
Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
addcriteria.add(Express.like(“address”,”%tianjin%”));
List list=criteria.list();
for(int i=0;i
User user=(User)list.get(i);
System.out.println(user.getName()+”\n”);
Set addresses=user.getAddresses();
Iterator it=addresses.iterator();
while(it.hasNext(){
Address address=(Address)it.next();
System.out.println(address.getAddress()+”\n”);
}
}
當執行到了(1)處時(shí),表明要針對User對象的addresses屬性添加新的查詢(xún)條件,因此當執行criteria.list()時(shí),Hibernate會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
正如我們所見(jiàn),我們可以通過(guò)向Criteria中添加保存關(guān)聯(lián)對象的集合屬性(addresses屬性保存與User對象相關(guān)聯(lián)的Address對象),來(lái)構造復合查詢(xún),在數據庫一端是通過(guò)內連接查詢(xún)來(lái)實(shí)現。
相關(guān):
1. Hibernate
2.
Hibernate QBC查詢(xún)
QBC查詢(xún):
QBC查詢(xún)就是通過(guò)使用Hibernate提供的Query By Criteria API來(lái)查詢(xún)對象,這種API封裝了SQL語(yǔ)句的動(dòng)態(tài)拼裝,對查詢(xún)提供了更加面向對象的功能接口。我們看下面的示例程序:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“name”,”zx”));
criteria.add(Expression.eq(“age”,new Integer(27));
List list=criteria.list();
當執行criteria.list()時(shí)會(huì )生成類(lèi)似這樣的SQL語(yǔ)句:Select * from user where name=’zx’ and age=27;所以在這里我們可以看出,Criteria實(shí)際上是一個(gè)查詢(xún)容器,它對查詢(xún)條件表達式的添加進(jìn)行了封裝,具體的查詢(xún)條件是通過(guò)add()方法添加的,而且具體的查詢(xún)條件的表達式運算是通過(guò)Expression指定的。Hibernate在運行期會(huì )根據Criteria指定的表達式條件來(lái)添加查詢(xún)條件,并且生成查詢(xún)語(yǔ)句。這種方式非常符合Java以及所有面向對象編程語(yǔ)言的編程方式,所以大多數的持久層框架都提供了對這種方式查詢(xún)的支持。下面我們講解這種查詢(xún)方式的各個(gè)技術(shù)細節。
1、Criteria查詢(xún)表達式:
正如我們所見(jiàn),Expression對查詢(xún)語(yǔ)句的表達式進(jìn)行了封裝和限制,下表列出了Expression所有的方法,以及每個(gè)方法所對應的查詢(xún)表達式及其限制。
方法
描述
Expression.eq
對應SQL的“field=value”表達式
如:Expression.eq(“name”,”zx”);
Expression.allEq
方法的參數為一個(gè)Map類(lèi)型對象,包含多個(gè)名/值對對應關(guān)系,相當于多個(gè)Expression.eq的疊加
Expression.gt
對應SQL的“field>value”表達式
Expression.ge
對應SQL的“field>=value”表達式
Expression.lt
對應SQL的“field”表達式
Expression.le
對應SQL的“field<=value”表達式
Expression.between
對應SQL語(yǔ)句的between表達式,如:查詢(xún)年齡在21與27歲之間的用戶(hù),可以寫(xiě)成Expression.between(“age”,new Integer(21),new Integer(27));
Expression.like
對應SQL語(yǔ)句的”field like value”表達式
Expression.in
對應SQL語(yǔ)句的“field in(……)”表達式
Expression.eqProperty
用于比較兩個(gè)屬性值,對應”field=field”SQL表達式
Expression.gtProperty
用于比較兩個(gè)屬性值,對應”field>field”SQL表達式
Expression.geProperty
用于比較兩個(gè)屬性值,對應”field>=field”SQL表達式
Expression.ltProperty
用于比較兩個(gè)屬性值,對應”field表達式
Expression.leProperty
用于比較兩個(gè)屬性值,對應”field<=field”SQL表達式
Expression.and
對應SQL語(yǔ)句的And關(guān)系組合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
Expression.or
對應SQL語(yǔ)句的Or關(guān)系組合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
Expression.sql
作為補充這個(gè)方法提供了原生SQL語(yǔ)句查詢(xún)的支持,在執行時(shí)直接通過(guò)原生SQL語(yǔ)句進(jìn)行限定,如:Expression.sql(“lower({alias}.name) like (?)”,“zhao%”,Hibernate.STRING) ;在運行時(shí){ alias }將會(huì )由當前查詢(xún)所關(guān)聯(lián)的實(shí)體類(lèi)名替換,()中的?將會(huì )由”zhao%”替換,并且類(lèi)型由Hibernate.STRING指定。
注意:Expression各方法中的屬性參數(各方法中的第一個(gè)參數)所指定的屬性名稱(chēng)(如:name,sex),并不是數據庫表中的實(shí)際字段名稱(chēng),而是實(shí)體對象中映射實(shí)際數據表字段的類(lèi)屬性名稱(chēng)。
2、示例查詢(xún):
示例查詢(xún)是通過(guò)Example類(lèi)來(lái)完成的,Example類(lèi)實(shí)現了Criterion接口,可以用作Criteria查詢(xún)條件,Example類(lèi)的作用是:根據已有對象,查詢(xún)屬性值與之相同的其他對象。如下代碼所示:
Criteria criteria=session.createCriteria(User.class);
User exampleuser=new User(“zx”);
criteria.add(Example.create(exampleuser));
List list=criteria.list();
for(int i=0;i
User user=(User)list.get(i);
System.out.println(user.getName()+”\n”);
}
上述代碼中User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));兩句相當于
criteria.add(Expression.eq(“name”,”zx”));因此會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
select * from user where name=’zx’;在上面的代碼中exampleuser稱(chēng)為示例對象。
在Hibernate中隊示例查詢(xún),默認情況下會(huì )排除掉示例對象中屬性值為空的屬性,還可以調用Example.excludeNone(排除空串值)/excludeZeros(排除零值),或者調用Example.excludeProperty方法來(lái)指定排除特定屬性。
示例查詢(xún)主要應用于組合查詢(xún)中,比如根據用戶(hù)輸入的查詢(xún)條件動(dòng)態(tài)生成最終的查詢(xún)語(yǔ)句,通過(guò)使用示例查詢(xún),可以避免由于查詢(xún)條件過(guò)多而寫(xiě)的大量if判斷語(yǔ)句。
3、復合查詢(xún):
復合查詢(xún)主要是處理,具有關(guān)聯(lián)關(guān)系的兩個(gè)實(shí)體怎樣進(jìn)行關(guān)聯(lián)查詢(xún),比如User實(shí)體對象與Addres實(shí)體對象具有一對多的關(guān)聯(lián)關(guān)系,我們可以如下構造符合查詢(xún):
Criteria criteria=session.createCriteria(User.class);
Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
addcriteria.add(Express.like(“address”,”%tianjin%”));
List list=criteria.list();
for(int i=0;i
User user=(User)list.get(i);
System.out.println(user.getName()+”\n”);
Set addresses=user.getAddresses();
Iterator it=addresses.iterator();
while(it.hasNext(){
Address address=(Address)it.next();
System.out.println(address.getAddress()+”\n”);
}
}
當執行到了(1)處時(shí),表明要針對User對象的addresses屬性添加新的查詢(xún)條件,因此當執行criteria.list()時(shí),Hibernate會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
正如我們所見(jiàn),我們可以通過(guò)向Criteria中添加保存關(guān)聯(lián)對象的集合屬性(addresses屬性保存與User對象相關(guān)聯(lián)的Address對象),來(lái)構造復合查詢(xún),在數據庫一端是通過(guò)內連接查詢(xún)來(lái)實(shí)現。
4、Criteria的高級特性:
A、限定返回記錄條數:
我們可以通過(guò)利用Criteria.setFirstResult/setMaxResult方法來(lái)限定返回某一次查詢(xún)的記錄數,如下代碼:
Criteria criteria=session.createCriteria(User.class);
criteria.setFirstResult(100);
criteria.setMaxResult(200);
通過(guò)以上代碼可以設定該次查詢(xún)返回user表中的從第100條記錄開(kāi)始直到第200條記錄結束的100條記錄。
B、對查詢(xún)結果進(jìn)行排序:
可通過(guò)使用net.sf.hibernate.expression.Order類(lèi)可以對查詢(xún)結果集進(jìn)行排序,如下面代碼:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“groupid”,”2”);
criteria.addOrder(Order.asc(“name”));
criteria.addOrder(Order.desc(“groupid”));
List list=criteria.list();
通過(guò)使用Order類(lèi)的asc()/desc()方法,可以指定針對某個(gè)字段的排序邏輯,如果執行上述代碼,會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select * from user where groupid=’2’ order by name asc,groupid desc
C、分組與統計:
在Hibernate3中,對Criteria又增添了新功能,可以支持分組與統計功能,在Hibernate3中增加了Projections以及ProjectionList類(lèi),這兩個(gè)類(lèi)對分組與統計功能進(jìn)行了封裝,如下代碼:
Criteria criteria=session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty(“age”));(1)
List list=criteria.list();
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
通過(guò)(1)處的代碼,我們通過(guò)Projections類(lèi)指定了用于分組的目標屬性,當進(jìn)行檢索時(shí)Hibernate會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select age from user group by age;
還可以通過(guò)使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法來(lái)實(shí)現統計功能,如下面的代碼示例:
Criteria criteria=session.createCriteria(User.class);
criteria.setProjection(Projections.avg(“age”));(1)
List list=criteria.list();
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
通過(guò)(1)處的代碼,我們實(shí)現了對用戶(hù)平均年齡的統計,當進(jìn)行檢索時(shí),Hibernate會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select avg(age) from user;
另外,在SQL語(yǔ)句中的多條件分組與統計功能,可以利用ProjectionList類(lèi)來(lái)實(shí)現,如下面代碼所示:
Criteria criteria=session.createCriteria(User.class);
ProjectionList prolist=Projections.projectionList();
prolist.add(Projections.groupProperty(“age”));
prolist.add(Projections.rowCount());
criteria.setProjection(prolist);
List list=criteria.list();
通過(guò)以上代碼,實(shí)現了對不同年齡人員數量的分組統計,當進(jìn)行檢索時(shí),Hibernate會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select age,count(*) from user group by age;
5、DetachedCriteria:
在Hibernate2中,Criteria實(shí)例是與創(chuàng )建它的Session實(shí)例具有相同的生命周期的,也就是說(shuō),Session實(shí)例是它所創(chuàng )建的Criteria實(shí)例的宿主,當Session關(guān)閉時(shí),寄生于Session實(shí)例的Criteria都將失效。這就對Criteria的重用造成了困難,為了實(shí)現Criteria實(shí)例的重用,在Hibernate3中提供了一個(gè)DetachedCriteria類(lèi),DetachedCriteria實(shí)例的生命周期與Session實(shí)例的生命周期無(wú)關(guān),我們可以利用DetachedCriteria對一些常用的Criteria查詢(xún)條件進(jìn)行抽離,當需要進(jìn)行檢索時(shí)再與Session實(shí)例關(guān)聯(lián),從而獲得運行期的Criteria實(shí)例。如下面的代碼所示:
DetachedCriteria dc= DetachedCriteria.forClass(User.class);
dc.add(Expression.eq(“name”,”zhaoxin”));
dc.add(Expression.eq(“sex”,”1”));
Criteria criteria=dc.getExecutableCriteria(session);
Iterator it=criteria.list().iterator();
while(it.hasNext()){
User user=(User)it.next();
System.out.println(user.getName());
}
正如我們所見(jiàn),DetachedCriteria的生存周期與session實(shí)例無(wú)關(guān),當需要進(jìn)行檢索時(shí),通過(guò)getExecutableCriteria(session)方法,與當前的Session實(shí)例關(guān)聯(lián)并獲得運行期的Criteria實(shí)例,完成檢索。
DetachedCriteria也可以用于完成子查詢(xún)功能,如下代碼所示:
DetachedCriteria dc= DetachedCriteria.forClass(User.class);
dc.setProjection(Projections.avg(“age”));
Criteria criteria=session.createCriteria(User.class);
criteria.add(Subqueries.propertyGt(“age”,dc));
List list=criteria.list();
通過(guò)Subqueries類(lèi),實(shí)現了添加子查詢(xún)的功能,我們將DetachedCriteria所設定的查詢(xún)條件,當作子查詢(xún)添加到了運行時(shí)Criteria實(shí)例的查詢(xún)條件中,當執行檢索時(shí)Hibernate會(huì )生成類(lèi)似如下的SQL語(yǔ)句:
Select * from user where age>(select avg(age) from user group by age);
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Hibernate之數據檢索
Hibernate入門(mén)之Criteria 查詢(xún)
Hibernate:HQL/QBC查詢(xún)語(yǔ)言比較的用法|中國IT實(shí)驗室
五、hibernate的Session操作, 查詢(xún)過(guò)濾, 緩存利用, 批量處理
hibernate Restrictions用法
Hibernate的DetachedCriteria使用(含Criteria)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久