《高級(jí)數(shù)據(jù)檢索》PPT課件.ppt_第1頁
《高級(jí)數(shù)據(jù)檢索》PPT課件.ppt_第2頁
《高級(jí)數(shù)據(jù)檢索》PPT課件.ppt_第3頁
《高級(jí)數(shù)據(jù)檢索》PPT課件.ppt_第4頁
《高級(jí)數(shù)據(jù)檢索》PPT課件.ppt_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Hibernate ORM 最佳實(shí)踐第6章 高級(jí)數(shù)據(jù)檢索,2,回顧,使用動(dòng)態(tài)類進(jìn)行關(guān)系映射 使用組件進(jìn)行關(guān)系映射 映射值類型的集合 一個(gè)持久化類對(duì)應(yīng)多個(gè)表的映射,3,目標(biāo),QBC(query by criteria)面向?qū)ο蟛樵兎绞?利用HQL和criteria連接查詢 Hibernate的數(shù)據(jù)檢索策略,4,QBC數(shù)據(jù)檢索,HQL示例,class book private String bname; private int bversion; private String author; private Date bdate; private String press; : : ,根據(jù)用戶輸入

2、的條件查詢所 需要的書籍. 如果使用HQL查詢: where的條件怎么設(shè)置?,session.createQuery(from book where ),QBC:Query by Criteria:以函數(shù)API的方式動(dòng)態(tài)設(shè)置查詢條件,組成查詢語句.,靜態(tài)字符串查詢語句,5,QBC查詢主要類,Criteria接口:用來設(shè)置各種查詢條件的,利用session的方法createCriteria(“目標(biāo)實(shí)體類類型”)創(chuàng)建criteria對(duì)象, Criteria crit=session.createCriteria(“Teacher.class”); 生成Criterion對(duì)象,作為查詢條件. Cri

3、terion cond=Restrictions.eq(“teacherID”,new Long(102); 利用Criteria接口方法add添加Criterion對(duì)象設(shè)置查詢條件 crit.add(cond); 調(diào)用Criteria的list方法或scroll方法執(zhí)行查詢語句. List results=crit.list(); ScrollableResults scrollresult=crit.scroll(); 從List或ScrollableResults 中取出查詢對(duì)象.,6,示例,7,示例,利用Criteria查詢101號(hào)老師所帶在校生和畢業(yè)生的學(xué)號(hào)及姓名:,運(yùn)行結(jié)果:,8,

4、分析-1,Criteria接口中的主要方法 Criteria add(Criterion criterion):添加查詢條件,作用where條件. 如果說查詢條件是多個(gè)并列或者是只要滿足其中一個(gè)條件,怎樣實(shí)現(xiàn)and或or邏輯操作? 如:查詢教師ID號(hào)200,并且教師姓名以T開頭的所有教師?,在Hibernate規(guī)定:當(dāng)設(shè)置多個(gè)add方法就相當(dāng)于對(duì)查詢條件進(jìn)行and操作.,9,分析-2,查詢教師ID=200或者教師姓名不以T或t開頭的所有教師.,Criteria addOrder(Order order)增加排序,Criteria createAlias(String associationPa

5、th,String alias),關(guān)聯(lián)實(shí)體屬性名,別名,為對(duì)象實(shí)體屬性設(shè)置別名來實(shí)現(xiàn)關(guān)聯(lián),Criteria createAlias(String associationPath,String alias,int joinType),CriteriaSpecification.INNER_JOIN, CriteriaSpecification.FULL_JOIN CriteriaSpecification.LEFT_JOIN ,CriteriaSpecification.RIGHT_JOIN,10,示例,查找教師101所帶學(xué)生姓名為劉的所有學(xué)生的學(xué)號(hào)及姓名,對(duì)象實(shí)體屬性student,11,代碼

6、,注意:createAlias()方法不會(huì)返回新的實(shí)例,還是原來的Criteria 實(shí)例,這樣設(shè)置Teacher與Student的關(guān)聯(lián)關(guān)系.,Criteria createCriteria(String associationPath,String alias),關(guān)聯(lián)實(shí)體屬性名,返回一個(gè)新的Criteria實(shí)例,12,代碼,產(chǎn)生新的Criteria實(shí)例crit1,Criteria setProjection (Projection projection),Projections類提供許多靜態(tài)方法來產(chǎn)生對(duì)查詢結(jié)果進(jìn)行選擇 某些屬性的投影,進(jìn)行avg、max、min、count、sum等聚集運(yùn)算。

7、,13,示例,計(jì)算學(xué)生中來自成都的有多少?,查詢來自成都的學(xué)生的學(xué)號(hào)及姓名,14,代碼,ProjectionLis:添加投影列,查詢返回的list對(duì)象中含有對(duì)象數(shù)組Object ,其中Object0代表sid,Object1代表sname,15,DetachedCriteria類,在前面例子中,在使用Criteria對(duì)象的前提必須有一個(gè)Session對(duì)象,因此這種依賴關(guān)系限制Criteria接口的使用范圍。 考慮以下情況: 需要在沒有Session對(duì)象的情況下創(chuàng)建數(shù)據(jù)查詢; 同一個(gè)數(shù)據(jù)查詢跨越多個(gè)Session對(duì)象 Hibernate提供一個(gè)可以脫離Session對(duì)象的查詢對(duì)象:Detache

8、dCriteria,DetachedCriteria.forClass(實(shí)體類類型),DetachedCriteria,封裝一個(gè) CriteriaImpl對(duì)象,getSession( ),session對(duì)象,criteria對(duì)象(脫離session),criteria.getExecutableCriteria(session),criteria對(duì)象(關(guān)聯(lián)session),16,示例,只有關(guān)聯(lián)到session后才可以list,17,小結(jié),18,Criterion類和Restrictions類,1.Criterion 是 Criteria 的查詢條件。 2.Criteria 提供了 add(Cr

9、iterion criterion) 方法來添 加查詢條件。 3.Criterion 的實(shí)例可以通過 Restrictions 工具類來 創(chuàng)建, Restrictions 提供了大量的靜態(tài)方法,如 eq (等于)、 ge (大于等于)、 between 等來方法 的創(chuàng)建 Criterion查詢條件( SimpleExpression 實(shí)例) 4.除此之外,Restrictions 還提供了方法來創(chuàng)建 conjunction 和 disjunction 實(shí)例,通過往該實(shí)例的 add(Criteria) 方法來增加查詢條件形成一個(gè)查詢 條件集合。,19,Restrictions類的方法,設(shè)置Cri

10、terion查詢條件,20,Projection和Projections類,1.Projection 主要是讓 Criteria 能夠進(jìn)行報(bào)表查詢,并可以實(shí)現(xiàn)分組。 Projection主要有 SimpleProjection 、 ProjectionList 和 Property 三個(gè)實(shí)現(xiàn)。其中 SimpleProjection 和 ProjectionList 的實(shí)例化是由內(nèi)建的 Projections 來完成,如提供的 avg 、 count 、 max 、 min 、 sum 可以讓開發(fā)者很容易對(duì)某個(gè)字段進(jìn)行統(tǒng)計(jì)查詢。 2. Property 是對(duì)某個(gè)字段進(jìn)行查詢條件的設(shè)置,如通過 P

11、orperty.forName(“color”).in(new String“black”,”red”,”write”); 則可以創(chuàng)建一個(gè) Criterion實(shí)例。 3.通過 criteria 的 setProjection(Projection) 方法加入到查詢條件中去。,21,Projections的方法,SimpleProjection 和 ProjectionList 的 實(shí)例化是由內(nèi)建的 Projections 來完成,22,示例,查詢來自成都的學(xué)生,并且由101號(hào)老師所帶的,該學(xué)生的學(xué)號(hào)及姓名,23,邏輯組合,如果邏輯關(guān)系比較復(fù)雜,可以使用Restrictions.disjunct

12、ion()代表邏輯或、Restrictions.conjuction()代表邏輯與,查詢由表101號(hào)老師所帶學(xué)號(hào)范圍(602-608)的姓王或姓劉的學(xué)生的學(xué)號(hào)、姓名,24,舉例查詢(QBE),使用Example類進(jìn)行查詢,Example 本身提供了一個(gè)靜態(tài)方法 create(Object entity) ,即根據(jù)一個(gè)對(duì)象(實(shí)際使用中一般是映射到數(shù)據(jù)庫的對(duì)象)來創(chuàng)建。然后可以設(shè)置一些過濾條件: Example exampleUser =Example.create(u) .ignoreCase() / 忽略大小寫 .enableLike(MatchMode.ANYWHERE); Criteria

13、 crit=session.createCriteria(Student.class); crit.add(exampleUser ); List results=crit.list();,ANYWHERE、END、EXACT、START,25,連接查詢,三中連接方式:內(nèi)連接、左外連接、右外連接,內(nèi)連接:是利用關(guān)鍵字INNER JOIN內(nèi)聯(lián)合兩個(gè)實(shí)體對(duì)象,只返回滿足關(guān)鍵字ON 定義 的條件的記錄。 任何不滿足條件的記錄都會(huì)被排除在結(jié)果之外; 外連接:在整個(gè)查詢過程中以一個(gè)表格為主,另一個(gè)表格為輔,主表格中的記錄不論是 否滿足條件都應(yīng)該出現(xiàn)在結(jié)果集合中,而輔助表格中的記錄則必須滿足條件。,一、H

14、QL連接查詢(inner join 、 left join 、 right join),26,示例,27,list中的每個(gè)元素是Object ,其中Object0 是Student對(duì)象,Object1是Teacher對(duì)象,28,HQL支持fetch查詢,在HQL中使用fetch,在返回的list中存放的對(duì)象是主類對(duì)象,而不是以對(duì)象組形式返回關(guān)聯(lián)的兩個(gè)類對(duì)象。,只返回主類對(duì)象Student,29,檢索策略-類級(jí)別,類級(jí)別 :關(guān)于POJO類什么時(shí)候被載入 類級(jí)別延遲加載(代理檢索策略),在編譯期間進(jìn)行字節(jié)碼增強(qiáng)操作,很少用,當(dāng)檢索一個(gè)類,其所有屬性 從數(shù)據(jù)庫中檢索到session中,當(dāng)檢索一個(gè)類,

15、得到是只有 主鍵屬性的代理對(duì)象(其它非主鍵屬性為空), 只有在訪問非主鍵屬性時(shí),才初始化其他屬性, 對(duì)象才載入.,類級(jí)別延遲加載只是在調(diào)用load函數(shù)時(shí)有用;如果使用get函數(shù),或者使用Query.list()執(zhí)行查詢,立即 加載類對(duì)象; 在POJO的映射文件中增加lazy屬性(true|false),默認(rèn)是延遲加載.,30,示例,類級(jí)別延遲加載,cp為代理對(duì)象,并沒有執(zhí)行select操作,訪問非主屬性,觸發(fā)select操作,31,類級(jí)別延遲加載,如果load的對(duì)象不存在,在執(zhí)行l(wèi)oad()時(shí)是不會(huì)發(fā)現(xiàn)的,只有在訪問非主鍵屬性時(shí)才拋出異常;,主鍵不存在,Load()執(zhí)行時(shí)正常的,沒發(fā)現(xiàn)id不存

16、在,對(duì)象只能在session范圍內(nèi)被加載,如果session關(guān)閉了,再返回對(duì)象就會(huì)拋出異常.,32,示例,提前關(guān)閉session,33,示例,類級(jí)別延遲對(duì)get或Query.list()方法不起作用,立即檢索,立即檢索,select操作觸發(fā),相當(dāng)于lazy=false,執(zhí)行l(wèi)oad()函數(shù),34,關(guān)聯(lián)級(jí)別檢索,關(guān)聯(lián)級(jí)別:檢索主類相關(guān)聯(lián)的實(shí)體或?qū)嶓w集合什么時(shí)候載入的策略,關(guān)聯(lián)實(shí)體的載入策略(one-to-one或many-to-one),注意: 當(dāng)關(guān)聯(lián)實(shí)體使用fetch=join時(shí),lazy的延遲加載失去意義.,因?yàn)檫B接查詢把關(guān)聯(lián)對(duì)象同時(shí)載入. 關(guān)聯(lián)實(shí)體是否延遲加載,還要參考關(guān)聯(lián)實(shí)體的類級(jí)別載入

17、策略.,35,代碼,主類級(jí)別檢索策略,關(guān)聯(lián)實(shí)體的檢索策略,關(guān)聯(lián)類的檢索策略,36,關(guān)聯(lián)類的載入策略,中l(wèi)azy屬性,只要有一個(gè)條件為立即載入,最后關(guān)聯(lián)類立即載入,注意:只要中l(wèi)azy屬性為false,不用判斷關(guān)聯(lián)類的lazy屬性,最終關(guān)聯(lián)類立即載入; 如果中l(wèi)azy屬性為proxy,還需要判斷關(guān)聯(lián)類lazy屬性.,37,示例-1,關(guān)聯(lián)類立即加載,主類延遲加載,38,示例-2,關(guān)聯(lián)類立即加載,主類立即加載,39,示例-3,主類延遲加載,關(guān)聯(lián)類延遲加載,40,示例-4,關(guān)聯(lián)類立即加載等同 fetch=“join”,進(jìn)行左外連接,41,示例-5,進(jìn)行左外連接,連接操作表示立即加載,42,關(guān)聯(lián)級(jí)別檢索,(2)關(guān)聯(lián)集合的載入策略(one-to-many或many-to-many) 采用什么載入策略,是由中的lazy屬性和fetch屬性決定的.,43,示例,關(guān)聯(lián)集合立即載入,44,示例,關(guān)聯(lián)集合延遲加載,調(diào)用集合的任何函數(shù)時(shí),觸發(fā)select操作,45,示例,關(guān)聯(lián)集合進(jìn)一步延遲加載,只有訪問到集合中每一個(gè)對(duì)象才可載入.,46,示例,關(guān)聯(lián)集合延遲載入,subselect檢索方式,不受主類

溫馨提示

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

評(píng)論

0/150

提交評(píng)論