HibernateCriteria進(jìn)階查詢?cè)趺词褂?/h1>

這篇文章主要介紹“Hibernate Criteria進(jìn)階查詢?cè)趺词褂谩?,在日常操作中,相信很多人在Hibernate Criteria進(jìn)階查詢?cè)趺词褂脝栴}上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Hibernate Criteria進(jìn)階查詢?cè)趺词褂谩钡囊苫笥兴鶐椭?!接下來,?qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)專業(yè)成都做網(wǎng)站、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)稿等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。

使用Criteria進(jìn)行查詢時(shí),不僅僅能組合出SQL中where子句的功能,還可以組合出如排序、統(tǒng)計(jì)、分組等的查詢功能。這就是Criteria進(jìn)階查詢。

排序
您可以使用Criteria進(jìn)行查詢,并使用org.hibernate.criterion.Order對(duì)結(jié)果進(jìn)行排序,例如使用Oder.asc(),指定根據(jù)”age”由小到大排序(反之則使用desc()):

Criteria criteria = session.createCriteria(User.class);  criteria.addOrder(Order.asc("age"));  List users = criteria.list();

注意在加入Order條件時(shí),使用的是addOrder()方法,而不是add()方法,在產(chǎn)生SQL語句時(shí),會(huì)使用order by與asc(desc)來進(jìn)行排序指定:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc

限定查詢筆數(shù)
Criteria的setMaxResults()方法可以限定查詢回來的筆數(shù),如果配合setFirstResult()設(shè)定傳回查詢結(jié)果***筆資料的位置,就可以實(shí)現(xiàn)簡(jiǎn)單的分頁(yè),例如傳回第51筆之后的50筆資料(如果有的話):

Criteria criteria = session.createCriteria(User.class);  criteria.setFirstResult(51);  criteria.setMaxResults(50);  List users = criteria.list();

根據(jù)您所指定得資料庫(kù),Hibernate將自動(dòng)產(chǎn)生與資料庫(kù)相依的限定筆數(shù)查詢子句,例如在MySQL中,將使用limit產(chǎn)生以下的SQL語句:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?

統(tǒng)計(jì)動(dòng)作
您可以對(duì)查詢結(jié)果進(jìn)行統(tǒng)計(jì)動(dòng)作,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入條件設(shè)定,例如對(duì)查詢結(jié)果的"age"作平均:

Criteria criteria = session.createCriteria(User.class);  criteria.setProjection(Projections.avg("age"));  List users = criteria.list();

上面的程式將由Hibernate自動(dòng)產(chǎn)生SQL的avg函數(shù)進(jìn)行平均計(jì)算:

Hibernate: select avg(this_.age) as y0_ from T_USER this_

分組
還可以配合Projections的groupProperty()來對(duì)結(jié)果進(jìn)行分組,例如以"age"進(jìn)行分組,也就是如果資料中"age"如果有 20、20、25、30,則以下會(huì)顯示20、25、30:

Criteria criteria = session.createCriteria(User.class);  criteria.setProjection(Projections.groupProperty("age"));  List users = criteria.list();

上面的程式將由Hibernate自動(dòng)產(chǎn)生SQL的group by子句進(jìn)行分組計(jì)算:

Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age

如果想同時(shí)結(jié)合統(tǒng)計(jì)與分組功能,則可以使用org.hibernate.criterion.ProjectionList,例如下面的程式會(huì)計(jì)算每個(gè)年齡各有多少個(gè)人:

ProjectionList projectionList = Projections.projectionList();  projectionList.add(Projections.groupProperty("age"));  projectionList.add(Projections.rowCount());    Criteria criteria = session.createCriteria(User.class);  criteria.setProjection(projectionList);  List users = criteria.list();

觀察所產(chǎn)生的SQL語句,將使用group by先進(jìn)行分組,再針對(duì)每個(gè)分組進(jìn)行count函數(shù)的計(jì)數(shù),

Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age

根據(jù)已知物件進(jìn)行查詢
設(shè)定查詢條件并非一定要使用Restrictions,如果屬性條件很多,使用Restrictions也不方便,如果有一個(gè)已知的物件,則可以根據(jù)這個(gè)物件作為查詢的依據(jù),看看是否有屬性與之類似的物件,例如:

User user = new User();  user.setAge(new Integer(30));   Criteria criteria = session.createCriteria(User.class);  criteria.add(Example.create(user));   List users = criteria.list();

Criteria進(jìn)階查詢中,您可以透過 org.hibernate.criterion.Example的create()方法來建立Example實(shí)例,Example實(shí)作了 Criteria介面,因此可以使用add()方法加入至Criteria條件設(shè)定之中,Hibernate將自動(dòng)過濾掉空屬性,根據(jù)已知物件上已設(shè)定的屬性,判定是否產(chǎn)生于where子句之中:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)

設(shè)定SQL范本
如果您了解如何撰寫SQL語句,想要設(shè)定一些Hibernate產(chǎn)生SQL時(shí)的范本,您也可以使用Restrictions的sqlRestriction()方法,提供SQL語法范本作限定查詢,例如查詢name以cater開頭的資料:

Criteria criteria = session.createCriteria(User.class);  criteria.add(Restrictions.sqlRestriction(  "{alias}.name LIKE (?)", "cater%", Hibernate.STRING));  List users = criteria.list();

其中alias將被替換為與User類別相關(guān)的名稱,而? 將被替換為cater%,也就是第二個(gè)參數(shù)所提供的值,sqlRestriction()方法***個(gè)參數(shù)所設(shè)定的是where子句的部份,所以在SQL撰寫時(shí),不必再寫where,觀察所產(chǎn)生的SQL語句,將使用您所設(shè)定的SQL范本作為基礎(chǔ),來完成SQL的條件查詢:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name LIKE (?)

如果有多個(gè)查詢條件,例如between子句的查詢,則可以如下:

Criteria criteria = session.createCriteria(User.class);  Integer[] ages = {new Integer(20), new Integer(40)};  Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};  criteria.add(Restrictions.sqlRestriction(  "{alias}.age BETWEEN (?) AND (?)", ages, types));  List users = criteria.list();

觀察所產(chǎn)生的SQL語句如下:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age BETWEEN (?) AND (?)

到此,關(guān)于“Hibernate Criteria進(jìn)階查詢?cè)趺词褂谩钡膶W(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

當(dāng)前文章:HibernateCriteria進(jìn)階查詢?cè)趺词褂?/a>
本文URL:
http://muchs.cn/article6/pdgdog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、虛擬主機(jī)、微信小程序、網(wǎng)站排名關(guān)鍵詞優(yōu)化、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)