使用Hibernate查詢數(shù)據(jù)課件_第1頁
使用Hibernate查詢數(shù)據(jù)課件_第2頁
使用Hibernate查詢數(shù)據(jù)課件_第3頁
使用Hibernate查詢數(shù)據(jù)課件_第4頁
使用Hibernate查詢數(shù)據(jù)課件_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第14章 使用hibernate查詢數(shù)據(jù)1使用hibernate查詢數(shù)據(jù)目 錄12 使用hql查詢數(shù)據(jù) 使用qbc查詢數(shù)據(jù)2使用hibernate查詢數(shù)據(jù)14.1 使用hql查詢數(shù)據(jù)3使用hibernate查詢數(shù)據(jù)14.1 使用hql查詢數(shù)據(jù) hql(hibernate query language)是hibernate提供的一種面向對象的查詢語言,hql提供了更加豐富靈活的特性,提供了強大的查詢能力。在hibernate中,將hql作為推薦的查詢模式,使用類、對象和屬性概念,沒有表和字段的概念。hql提供了更接近傳統(tǒng)sql語句的查詢語法。 使用傳統(tǒng)的jdbc api來查詢數(shù)據(jù),需要編寫復雜的

2、sql語句,然后還要將查詢結果以對象的形式進行封裝,放到集合對象中保存。這種查詢方式不僅麻煩,而且容易出錯。 hql查詢與jdbc查詢相比,具體以下優(yōu)點: 直接針對實體類和屬性進行查詢,不要再編寫繁瑣的sql語句。 查詢結果是直接保存在list中的對象,不要再次封裝。 可以通過配置dialect屬性,對不同的數(shù)據(jù)庫自動生成不同的用于執(zhí)行的sql語句。4使用hibernate查詢數(shù)據(jù)14.1.1 簡單查詢 從數(shù)據(jù)表meal中查詢所有的產(chǎn)品對象,按照名稱升序排序,將查詢結果輸出到控制臺。 將項目hibernate-3復制并命名為“hibernate-10”,再導入到myeclipse開發(fā)環(huán)境中。在

3、測試類hibernatetest中添加testhql_1()方法,并使用test注解加以修飾。代碼如下: string hql = from meal as m order by m.mealname asc; hql語句“from meal as m”中meal是類名,而不是表名,因此需要區(qū)分大小寫,關鍵字from不區(qū)分大小寫。 在hql語句中可以使用別名,例如m是meal類的別名,別名可以使用關鍵字as指定,as關鍵字也可以省略。 通過order by子句將查詢結果按照餐品名稱升序排序。升序排序的關鍵字是asc,降序排序的關鍵字是desc,查詢語句中默認為升序。import org.hib

4、ernate.query.query; test public void testhql_1() / 編寫hql語句 string hql = from meal as m order by m.mealname asc; / 創(chuàng)建query對象 query query= session.createquery(hql,meal.class); / 執(zhí)行查詢,獲得結果 list list=query.getresultlist() ; / 遍歷查找結果 iterator iterator=list.iterator(); while (iterator.hasnext() meal meal

5、= iterator.next(); system.out.println(meal.getmealid()+. + meal .getmealname() + :t + meal .getmealsummarize(); 5使用hibernate查詢數(shù)據(jù)14.1.2 屬性查詢 簡單查詢的結果是對象的所有屬性,如果只查詢對象的部分屬性,則稱為屬性查詢,也稱為投影查詢。在測試類hibernatetest中添加testhql_2()方法,并使用test注解加以修飾,代碼如下: test public void testhql_1() / 編寫hql語句,使用屬性查詢 string hql=sele

6、ct m.mealid,m.mealname from meal as m; / 創(chuàng)建query對象,此處不使用泛型 query query= session.createquery(hql); / 執(zhí)行查詢,獲得結果 list list=query.getresultlist() ; / 遍歷查找結果 iterator iterator=list.iterator(); while (iterator.hasnext() object object=(object)iterator.next(); system.out.println(object0+. +object1); 6使用hibe

7、rnate查詢數(shù)據(jù)14.1.3 聚集函數(shù) 在hql語句中可以使用的聚集函數(shù)包括統(tǒng)計記錄總數(shù)(count)、計算最小值(min)、計算最大值(max)、計算和(sum)、計算平均值(avg)。 在實體類meal.java中有一個屬性mealprice,在映射文件中meal.hbm.xml中已經(jīng)為meal.java中的屬性mealprice配置了映射,對應數(shù)據(jù)表meal中的mealprice字段。在測試類hibernatetest中添加testhql_3()方法,并使用test注解加以修飾,代碼如下: / 使用count 統(tǒng)計餐品的記錄總數(shù) string hql1=select count(m)

8、from meal m; query query1= session.createquery(hql1); long count=(long)query1.uniqueresult(); / 使用avg 統(tǒng)計餐品的平均價 string hql2=select avg(m.mealprice) from meal m; query query2= session.createquery(hql2); double money=(double)query2.uniqueresult(); / 使用max 和min 統(tǒng)計最貴和最便宜的餐品 string hql2=select max(m.mealp

9、rice),min(m.mealprice) from meal m; query query3= session.createquery(hql3); object price=(object)query3.uniqueresult(); system.out.println(記錄總數(shù): +count+ ,平均金額: +money+ ,最低價格為:+price0 +,最高價格為:+price1);7使用hibernate查詢數(shù)據(jù)14.1.4 分組查詢 在測試類hibernatetest中添加testhql_4()方法,并使用test注解修飾,以餐品菜系為分組依據(jù)對所有餐品進行分組,查詢數(shù)據(jù)表

10、meal中各種類型的餐品總數(shù),代碼如下: / 分組統(tǒng)計餐品的菜系總數(shù) string hql=select m.mealseries.seriesname,count(*) from meal m group by m.mealseries; query query= session.createquery(hql); list list=query.getresultlist() ; / 遍歷查找結果 iterator iterator=list.iterator(); while (iterator.hasnext() object object=(object)iterator.next(

11、); system.out.println(“菜系:+ object0 + ,餐品總數(shù):+ object1); 8使用hibernate查詢數(shù)據(jù)14.1.5 動態(tài)實例查詢 在屬性查詢(或投影查詢)時,返回的查詢結果是一個對象數(shù)組,不易操作。為了提供檢索效率,可將檢索出來的屬性封裝到一個實體類對象中,這種方式就是動態(tài)實例查詢。 在測試類hibernatetest中添加testhql_5()方法,并使用test注解加以修飾,只查詢餐品信息中的名稱和id號,將檢索出來的屬性封裝到一個實體類的對象中,代碼如下: 在hql語句中使用了meal類的帶餐品id號和餐品名稱兩個參數(shù)的構造方法,因此需要在實體類

12、meal類中添加這個構造方法。 /編寫hql語句,使用動態(tài)實例查詢 string hql = select new meal(m.mealid,m.mealname) from meal m; query query= session.createquery(hql,meal.class); list list=query.getresultlist() ; for(meal m : list) system.out.println(m.getmealid() + . + m.getmealname(); 9使用hibernate查詢數(shù)據(jù)14.1.6 分頁查詢 批量查詢數(shù)據(jù)時,在單個頁面上顯示

13、所有的查詢結果會存在一定的問題,因此需要對查詢結果進行分頁顯示。query接口提供了用于分頁顯示查詢結果的方法: (1) setfirstresult(int firstresult) (2) setmaxresult(int maxresult) 分頁查詢是系統(tǒng)中常用的一個功能,為了方便調用,先在測試類hibernatetest中添加方法pagedsearch(int pageindex, int pagesize),根據(jù)頁碼和每頁顯示記錄數(shù)從數(shù)據(jù)表meal中獲取相應的記錄。第一個參數(shù)表示當前頁碼,第二個參數(shù)表示每頁顯示多少個對象。 然后在測試類hibernatetest中添加testhql

14、_6()方法,并使用test注解加以修飾,調用pagedsearch方法。10使用hibernate查詢數(shù)據(jù)14.1.7 條件查詢 實際應用中,常常需要根據(jù)指定的條件進行查詢。此時,可以使用hql語句提供的where子句進行查詢,或者使用like關鍵字進行模糊查詢。 根據(jù)提供的參數(shù)形式,條件查詢有兩種:按參數(shù)位置查詢和按參數(shù)名字查詢。 1按參數(shù)位置查詢 按參數(shù)位置查詢時,在hql語句中需要使用“?”來定義參數(shù)的位置。在測試類hibernatetest中添加testhql_7()方法,并使用test注解加以修飾,按照參數(shù)位置查詢的方式,查詢產(chǎn)品名稱包含“魚”的餐品信息。語句如下: string

15、hql = from meal m where m.mealname like ?; query.setstring(0, “%魚%”);/不推薦 query.setparameter(0, %魚%); 11使用hibernate查詢數(shù)據(jù)14.1.7 條件查詢 2按參數(shù)名字查詢 按參數(shù)名字查詢時,需要在hql語句中定義命名參數(shù),且命名參數(shù)需要以“:”開頭。在測試類hibernatetest中添加testhql_8()方法,并使用test修飾,按照參數(shù)名字查詢的方式,查詢產(chǎn)品名稱包含“魚”的產(chǎn)品信息。 string hql = from meal m where m.mealname like

16、:mname; query.setparameter(mname, %魚%); 在hql語句中設定查詢條件,可使用如表所示各種運算。類型hql運算符比較運算=、=、2 ; hql語句中,子查詢中引用了外層語句中的別名“ms”,它是mealseries類的別名。每個菜系包含多個餐品記錄,即在meal表中有多條餐品記錄對應著mealseries表中的同一條記錄,在mealseries類中創(chuàng)建了set類型的屬性mealset。 15使用hibernate查詢數(shù)據(jù)14.1.9 子查詢 2無關子查詢 無關子查詢是指子查詢語句與外層查詢語句無關。在測試類hibernatetest中添加testhql_12

17、()方法,并使用test加以修飾,使用無關子查詢檢索所有低于平均價的餐品對象。 string hql=from meal m where m.mealprice15); (2) 使用in關鍵字的子查詢 在測試類hibernatetest中添加testhql_14()方法,并使用test注解加以修飾,使用in關鍵字查詢數(shù)據(jù)表meal中包含3條餐品記錄的菜系名稱。 string hql=from mealseries ms where 3 in(select count(m) from ms.mealset as m) ;17使用hibernate查詢數(shù)據(jù)14.2使用qbc查詢數(shù)據(jù)18使用hibe

18、rnate查詢數(shù)據(jù)14.2 使用qbc查詢數(shù)據(jù) qbc是qurey by criteria首字母縮寫,criteria是hibernate api提供的一個查詢接口,位于org.hibernate包下。criteria查詢又稱為對象查詢,它使用一種封裝了基于字符串形式的查詢語句的api來查詢對象。 qbc查詢主要由criteria接口來完成,該接口由hibernate session創(chuàng)建,criterion是criteria的查詢條件。criteria提供了add(criterion criterion)方法來添加查詢條件。 criterion接口的主要實現(xiàn)類包括example、junctio

19、n和simpleexpression。example主要用來提供qbe(qurey by example)檢索方式,是qbc的子功能。 criterion接口的實現(xiàn)類一般通過restrictions工具類來創(chuàng)建。使用工具類order相關方法設置排序方式,如order.asc表示升序,order.desc表示降序。19使用hibernate查詢數(shù)據(jù)14.2.1 簡單查詢 在使用hql查詢方式時,需要定義基于字符串形式的hql語句,雖然比jdbc代碼有所進步,但仍然繁瑣且不方便使用參數(shù)查詢。criteria采用面向對象的方式封裝查詢條件,criteria api提供了查詢對象的另一種方式,提供了c

20、riteria接口、criterion接口、expression類,以及restrictions類作為輔助。從而使得查詢代碼的編寫更加方便。 使用restrictions輔助類,進行criteria查詢的步驟如下: 創(chuàng)建criteria對象 使用restrictions對象編寫查詢條件,并將查詢條件加入criteria對象 執(zhí)行查詢,獲得結果 在測試類hibernatetest中添加testcriteria_1()方法,使用test加以修飾,使用criteria方式從數(shù)據(jù)表meal中查詢所有餐品對象。代碼如下: test public void testcriteria_1() / 創(chuàng)建查詢所

21、有餐品的criteria對象 criteria c=session.createcriteria(meal.class); / 對查詢結果按 mealname升序排序 c.addorder(order.asc(mealname); / 執(zhí)行查詢,獲取結果 list list=c.list(); / 循環(huán)輸出查詢結果 for(meal m : list) system.out.println(m.getmealid() + . + m.getmealname(); 20使用hibernate查詢數(shù)據(jù)14.2.2 分組查詢 根據(jù)所屬菜系對餐品記錄進行分組,在測試類hibernatetest中添加t

22、estcriteria_2()方法,使用test加以修飾,查詢meal表中各個菜系的餐品總記錄數(shù)及總金額。 / 創(chuàng)建查詢所有餐品的criteria對象 criteria c=session.createcriteria(meal.class); / 構建projectionlist對象 projectionlist plist=pjectionlist(); / 創(chuàng)建分組依據(jù),按菜系進行分組 plist.add(projections.groupproperty(mealseries); / 統(tǒng)計各分組中的記錄數(shù) plist.add(projections.rowc

23、ount(); / 統(tǒng)計各分組中的餐品價格總和 plist.add(projections.sum(mealprice); c.setprojection(plist); / 為criteria對象設置projection list list=c.list();/ 執(zhí)行查詢,獲取結果 iterator iterator=list.iterator(); / 遍歷查詢結果 while(iterator.hasnext() object obj=(object) iterator.next(); mealseries ms=(mealseries)obj0;system.out.println(菜

24、系名稱:+ ms.getseriesname() + tt餐品記錄總數(shù): +obj1+ t價格總和:+ obj2); 21使用hibernate查詢數(shù)據(jù)14.2.3 聚集函數(shù) 在測試類hibernatetest中添加testcriteria_3()方法,并使用test注解加以修飾,使用內置聚集函數(shù)統(tǒng)計meal表中所有餐品價格總和、平均價格、最大價格和最小價格。 / 創(chuàng)建查詢所有餐品的criteria對象 criteria c=session.createcriteria(meal.class); / 構建projectionlist對象 projectionlist plist=project

25、jectionlist(); / 統(tǒng)計餐品價格總和 plist.add(projections.sum(mealprice); / 統(tǒng)計餐品平均價格 plist.add(projections.avg(mealprice); / 統(tǒng)計餐品最高價格 plist.add(projections.max(mealprice); / 統(tǒng)計餐品最低價格 plist.add(projections.min(mealprice); / 為criteria對象設置projection c.setprojection(plist); 22使用hibernate查詢數(shù)據(jù)14.2.4 組合查詢 組合

26、查詢是指通過restrictions工具類的相應方法動態(tài)構造查詢條件,并將查詢條件加入criteria對象,從而實現(xiàn)查詢功能。在測試類hibernatetest中編寫testcriteria_4()方法,并使用test注解加以修飾,按餐品名稱和餐品價格查詢餐品對象。 restrictions提供了大量的靜態(tài)方法,來創(chuàng)建查詢條件,如表所示。 matchmode表示匹配模式,包含的靜態(tài)常量如表所示。 / 封裝查詢條件 meal condition=new meal(); condition.setmealname(蝦); condition.setmealprice(18.00); / 創(chuàng)建cri

27、teria對象 criteria c=session.createcriteria(meal.class); / 使用restrictions對象編寫查詢條件,并將查詢條件加入到criteria對象 if (condition!=null) if (condition.getmealname()!=null & !condition.getmealname().equals() / 按餐品名稱進行篩選 c.add(restrictions.like(mealname, condition.getmealname(),matchmode.anywhere); if (condition.getm

28、ealprice()restrictions.ge大于等于 =restrictions.lt小于 restrictions.le小于等于 =restrictions.between對應sql的between子句restrictions.like對應sql的like子句restrictions.in對應sql的in子句restrictions.andand關系restrictions.oror關系restrictions.sqlrestrictionsql限定查詢匹配模式說明matchmode.anywhere 模糊匹配matchmode.exact精確匹配matchmode.start以某個字

29、符為開頭進行匹配matchmode.end以某個字符為結尾進行匹配23使用hibernate查詢數(shù)據(jù)14.2.5 關聯(lián)查詢 使用criteria并通過 restrictions 工具類,可以實現(xiàn)關聯(lián)查詢。在測試類hibernatetest中編寫testcriteria_5()方法,并使用test注解加以修飾,實現(xiàn)從數(shù)據(jù)表meal中查詢菜系為“川菜”的餐品名稱包含“魚”的產(chǎn)品。 / 創(chuàng)建criteria對象 criteria mcriteria=session.createcriteria(meal.class); / 設置從meal類中查詢的條件 mcriteria.add(restricti

30、ons.like(mealname,魚, matchmode.anywhere); / 創(chuàng)建一個新的criteria實例,以引用mealseries集合中的元素 criteria mscriteria=mcriteria.createcriteria(mealseries); / 設置從關聯(lián)的mealseries類中查詢的條件 mscriteria.add(restrictions.like(seriesname, 川菜); / 執(zhí)行查詢,獲取結果 list list=mcriteria.list(); / 循環(huán)輸出查詢結果 for(meal m : list) system.out.prin

31、tln(餐品名稱: + m.getmealname()+ t價格: +m.getmealprice(); 24使用hibernate查詢數(shù)據(jù)14.2.6 分頁查詢 使用criteria并通過restrictions 工具類,可以實現(xiàn)分頁查詢。hibernate的criteria也提供了兩個用于實現(xiàn)分頁的方法:setfirstresult(int firstresult)和setmaxresults(int maxresults)。其中setfirstresult(int firstresult)方法用于指定從哪個對象開始檢索,默認為第一個對象(序號為0);setmaxresults(int m

32、axresults)方法用于指定一次最多檢索的對象數(shù),默認為所有對象。 在測試類hibernatetest中添加testcriteria_6()方法,使用test注解加以修飾。 / 創(chuàng)建criteria對象 criteria c=session.createcriteria(meal.class); / 從第一個對象開始查詢 c.setfirstresult(0); / 每次從查詢結果中返回4個對象 c.setmaxresults(4); list list=c.list(); / 循環(huán)輸出查詢結果 for(meal m : list) system.out.println(餐品名稱: + m

33、.getmealname()+ t價格: +m.getmealprice(); 25使用hibernate查詢數(shù)據(jù)14.2.7 qbe查詢 qbe是query by example的縮寫,qbe查詢?yōu)榕e例查詢,也稱示例查詢。由于qbe查詢檢索與指定示例對象具有相同屬性值的對象,因此示例對象的創(chuàng)建是qbe查詢的關鍵。示例對象中的所有非空屬性都作為查詢的條件。 以testcriteria_4()方法中實現(xiàn)的組合查詢?yōu)槔?,組合的條件越多,需要的if語句就越多,相當繁瑣,此時使用qbe查詢最方便。在測試類hibernatetest中編寫testcriteria_7()方法,使用test注解加以修飾,按餐品名稱和餐品價格查詢餐品對象。 / 封裝查詢條件 meal condition=new meal(); condition.setmealname(蝦); condition.setmealprice(18.00); / 創(chuàng)建criteria對象 criteria c=session.createcriteria(meal.class); /使用example工具類創(chuàng)建示例,將屬性mealprice排除在示例查詢外 example example= example.create(condition).excludeproperty(meal

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論