數(shù)據(jù)查詢方式_第1頁
數(shù)據(jù)查詢方式_第2頁
數(shù)據(jù)查詢方式_第3頁
數(shù)據(jù)查詢方式_第4頁
數(shù)據(jù)查詢方式_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 數(shù)據(jù)查詢方式 回顧 1. HQL查詢方式 2. QBC查詢方式(Query By Criteria) 3. 原生SQL方式導(dǎo)入新課 1. HQL查詢方式 2. QBC查詢方式 3. 原生SQL方式難點: HQL,QBC8.3 8.3 數(shù)據(jù)查詢方式Hibernate提供的面向?qū)ο蟛樵兎绞?,通過正確配置關(guān)聯(lián)關(guān)系,指定查詢條件,就可以輕松得到數(shù)據(jù),避免冗長的SQL代碼。Hibernate支持的數(shù)據(jù)查詢方式包括:HQLQBC原生SQL 返回8.3.1 8.3.1 數(shù)據(jù)查詢方式HQLHQL(1 1)HQL(Hibernate Query Language)語法結(jié)構(gòu)和SQL相似,其功能如下 :支持條件查

2、詢。支持連接查詢。支持分頁查詢。支持分組查詢(having和group by)。支持內(nèi)置函數(shù)和自定義函數(shù)查詢(sum()、min()、max())。支持子查詢,即嵌入式查詢。支持動態(tài)綁定參數(shù)查詢。8.3.1 8.3.1 數(shù)據(jù)查詢方式HQLHQL(2 2)Session類的find()方法以及Query接口都支持HQL檢索方式。區(qū)別在于:前者只是執(zhí)行一些簡單HQL查詢語句的便捷 方 法 , 不 具 有 動 態(tài) 綁 定 參 數(shù) 的 功 能 , 而 且 在Hibernate3.x版本中,已經(jīng)淘汰了find()方法;而Query接口才是真正的HQL查詢接口,它提供了以上列出的各種查詢功能。HQLHQL

3、查詢 完全面向?qū)ο蟮牟樵?例如:屬性查詢實例化查詢要定義對應(yīng)的要定義對應(yīng)的構(gòu)造函數(shù)構(gòu)造函數(shù)連接查詢使用使用join fetch連接,將連接,將會對學(xué)生預(yù)先抓取會對學(xué)生預(yù)先抓取join fetch統(tǒng)計函數(shù)(Aggregate functions)(Aggregate functions) 返回屬性的統(tǒng)計函數(shù)的結(jié)果 select avg(cat.weight) from eg.Cat cat select sum(cat.weight) from eg.Cat catselect max(cat.weight) from eg.Cat catselect count(cat) from eg.Ca

4、t catselect upper() from eg.Cat catselect distinct from eg.Cat cat多態(tài)(polymorphism)(polymorphism)查詢 下列查詢會返回所有的持久化對象 from java.lang.Object o from BusinessDocument o 業(yè)務(wù)單據(jù)業(yè)務(wù)單據(jù)報銷單報銷單請假單請假單采購單采購單l實際應(yīng)用:在一個列表頁面列出所有申請單 子查詢 對于支持子查詢的數(shù)據(jù)庫來說,Hibernate支持在查詢中嵌套子查詢 from Student stu where stu.age ( s

5、elect avg(s.age) from Student s ) 8.3.2 8.3.2 數(shù)據(jù)查詢方式QBCQBCQBC(Query By Criteria)使用Hibernate的Criteria API進(jìn)行數(shù)據(jù)檢索方式,通過Session類創(chuàng)建Criteria實例,并調(diào)用該實例的不同方法進(jìn)行數(shù)據(jù)檢索。采用HQL檢索方式時,在應(yīng)用程序中需要定義基于字符串形式的HQL查詢語句。QBC API 提供了檢索對象的另一種方式,它主要由Criteria接口、Criterion接口和Expression類組成,它支持在運行時動態(tài)生成查詢語句。通過將條件加入到Criteria實例中Criteria實例是

6、一個查詢條件的容器Criteria查詢是更符合面向?qū)ο蟮木幊谭绞絈BCQBC查詢(Query By Criteria)(Query By Criteria)查詢所有學(xué)生查詢年齡位于18-20之間,姓Zhang的學(xué)生 連接設(shè)定HQL中預(yù)先抓取Criteria查詢設(shè)置預(yù)先抓取,與上面等效HQL查詢總是忽略配置文件中的預(yù)先抓取查詢總是忽略配置文件中的預(yù)先抓取FetchMode.JOIN 預(yù)先抓取預(yù)先抓取FetchMode.SELECT 延遲加載延遲加載FetchMode.DEFAULT 使用配置中的加載策略使用配置中的加載策略 QBCQBC統(tǒng)計 在QBC中可以用Projections實現(xiàn)統(tǒng)計,Pro

7、jections有以下的方法: avg() rowCount() count() max() min() countDistinct() QBCQBC統(tǒng)計/統(tǒng)計員工數(shù)量統(tǒng)計員工數(shù)量Criteria crit = session.createCriteria(EmployeeVO.class);/ countDistinct() 去重復(fù)去重復(fù)crit.setProjection(Projections.count(oid);List emps = crit.list();/求年齡最大的員工求年齡最大的員工Criteria crit = session.createCriteria(Employe

8、eVO.class);crit.setProjection(Projections.max(“age);List emps = crit.list();QBCQBC去重復(fù)根元素 Criteria crit = session.createCriteria(EmployeeVO.class);crit.setFetchMode(department, FetchMode.JOIN);crit.setResultTransformer(crit.DISTINCT_ROOT_ENTITY);/去重復(fù)去重復(fù)List emps = crit.list();for (Iterator iter = emp

9、s.iterator(); iter.hasNext();) EmployeeVO emp = (EmployeeVO) iter.next();System.out.println(員工名稱:員工名稱:+emp.getEmpName()+ 部門:部門:+emp.getDepartment().getDeptName();數(shù)據(jù)查詢方式QBCQBCQBC查詢方式的實現(xiàn)步驟:/創(chuàng)建一個Criteria對象Criteria criteria=session.createCriteria(Customer.class);/設(shè)定查詢條件,然后把查詢條件加入到Criteria中Criterion crit

10、erion1= Expression.like(name, T%) ; Criterion criterion2= Expression.eq(age, new Integer(21) ;criteria.add(criterion1);criteria.add(criterion2);/執(zhí)行查詢語句,返回查詢結(jié)果List result=criteria.list();8.3.2 8.3.2 數(shù)據(jù)查詢方式QBCQBC(3 3)(1)調(diào)用Session的createCriteria()方法創(chuàng)建一個Criteria對象。(2)設(shè)定查詢條件。Expression類提供了一系列用于設(shè)定查詢條件的靜態(tài)方

11、法,這些靜態(tài)方法都返回Criterion實例,每個Criterion實例代表一個查詢條件。Criteria的add()方法用于加入查詢條件。(3)調(diào)用Criteria的list()方法執(zhí)行查詢語句。該方法返回List類型的查詢結(jié)果,在List集合中存放了符合查詢條件的持久化對象。對于以上程序代碼,當(dāng)運行Criteria的list()方法時,Hibernate執(zhí)行的SQL查詢語句為: select * from CUSTOMERS where NAME like T% and AGE=21;返回使用QBCQBC方式查詢部分字段和使用聚集函數(shù)代碼示例: ProjectionList proList

12、 = PjectionList(); proList.add(Projections.groupProperty(empno); proList.add(Projections.groupProperty(ename); proList.add(Projections.sum(sal); criteria.setProjection(proList); criteria.add(Restrictions.eq(deptNo, 20); List list = criteria.list();for (Object obj: list) Object objArray

13、 = (Object)obj;System.out.println(empno = + objArray0 + ,ename= + objArray1 + ,salavg= + objArray2);使用QBCQBC方式查詢部分字段和使用聚集函數(shù)生成的SQL語句如下Select this_.EMPNO as y0_, this_.ENAME as y1_,sum(this_.SAL) as y2_ from emp this_ where this_.DEPT_NO=? group by this_.EMPNO, this_.ENAME使用ProjectionList 可以將多個查詢組件合并在

14、一個list里面,然后一次性的放入到criteria中。查詢部分字段,其實就是變向的使用Projections.groupProperty8.3.3 8.3.3 數(shù)據(jù)查詢方式原生SQLSQL(1 1)采用HQL或QBC檢索方式時,Hibernate會生成標(biāo)準(zhǔn)的SQL查詢語句,適用于所有的數(shù)據(jù)庫平臺,因此這兩種檢索方式都是跨平臺的。 有的應(yīng)用程序可能需要根據(jù)底層數(shù)據(jù)庫的SQL方言,來生成一些特殊的查詢語句。在這種情況下,可以利用Hibernate提供的SQL檢索方式。8.3.3 8.3.3 數(shù)據(jù)查詢方式原生SQLSQL(2 2)原生SQL查詢方式的實現(xiàn)步驟:/創(chuàng)建Query對象String sql = select c.* from COURSES c where c.NAME =:name;SQLQuery query=session.createSQLQuery(sql);query.addEntity(c, Course.class);query.setString(name, shuxue);List list = query.list();返回8.3.3 8.3.3 數(shù)據(jù)查詢方式原生SQLSQL(2 2)Listlist=getSession().createSQLQuery(selectidid

溫馨提示

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

評論

0/150

提交評論