




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Photoshop平面設(shè)計(jì)基礎(chǔ) 課件 任務(wù)5.2 制作餅干宣傳海報(bào)
- 肉羊飼料定制銷售協(xié)議
- 房屋租賃合同標(biāo)準(zhǔn)化管理規(guī)范文本范本精裝修家具家電
- 成都臨街商鋪?zhàn)赓U及品牌宣傳合作合同
- 離婚協(xié)議書范本涉及知識(shí)產(chǎn)權(quán)分割
- 保安員整改方案
- 產(chǎn)業(yè)園區(qū)場(chǎng)地調(diào)研合作協(xié)議
- 餐飲企業(yè)租賃及品牌授權(quán)合同
- 店面承重柱改造方案
- 寧夏農(nóng)學(xué)面試題及答案
- 2023年下半年浙江溫州蒼南縣事業(yè)單位選調(diào)工作人員筆試參考題庫(共500題)答案詳解版
- (2023版)小學(xué)語文一年級(jí)上冊(cè)電子課本
- 新華鎮(zhèn)生活污水處理管網(wǎng)與新華農(nóng)場(chǎng)管網(wǎng)并網(wǎng)項(xiàng)目環(huán)境影響報(bào)告表
- 互聯(lián)網(wǎng)導(dǎo)論智慧樹知到課后章節(jié)答案2023年下上海第二工業(yè)大學(xué)
- 《旅游學(xué)概論》第七章
- 工程物探-第五章電法勘探課件
- KSS編碼說明電廠KKS編號(hào)
- 臺(tái)區(qū)線損綜合分析臺(tái)區(qū)線損分類及計(jì)算方法
- 人民醫(yī)院普外科臨床技術(shù)操作規(guī)范2023版
- 【酒店管理系統(tǒng)的設(shè)計(jì)與開發(fā)(論文)】
- 舉一反三- 三年級(jí)奧數(shù) - 第37講 面積計(jì)算
評(píng)論
0/150
提交評(píng)論