第5 6章hibernate課件08條件查詢_第1頁
第5 6章hibernate課件08條件查詢_第2頁
第5 6章hibernate課件08條件查詢_第3頁
第5 6章hibernate課件08條件查詢_第4頁
第5 6章hibernate課件08條件查詢_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

條件查詢講師:李剛本次要點條件查詢關(guān)聯(lián)和動態(tài)關(guān)聯(lián)投影運算離線查詢子查詢條件查詢Hibernate5直接借助了JPA的條件查詢,這是更具面向?qū)ο筇厣臄?shù)據(jù)查詢方式,通過如下幾個類完成。CriteriaBuilder:這是一個工廠類,這個工廠類用于創(chuàng)建CriteriaQuery、CriteriaUpdate、CriteriaDelete、Predicate、Expresssion。CriteriaQuery、CriteriaUpdate、CriteriaDelete:第一個API代表一個查詢,后面?zhèn)€API代表一個DML操作。Expression:代表一個表達(dá)式。Predicate:代表查詢條件。使用CriteriaBuilder的運算符方法組合兩個Expression來生成一個Predicate。Root:代表要查詢的根實體。Join:代表一個關(guān)聯(lián)。條件查詢步驟執(zhí)行條件查詢的步驟如下:(1)獲得JPA的EntityManager對象、并打開事務(wù)。(2)以EntityManager對象創(chuàng)建CriteriaBuilder對象。(3)調(diào)用CriteriaBuilder對象的createQuery()方法創(chuàng)建CriterionQuery查詢。(4)調(diào)用CriterionQuery對象的from()方法設(shè)置查詢的根實體,該方法返回一個Root對象。如果要查詢多個Root對象,這一步要執(zhí)行多次。(5)調(diào)用CriterionQuery對象的select()方法設(shè)置查詢語句的select部分。(6)調(diào)用CriterionQuery對象的where()方法設(shè)置查詢條件(相當(dāng)于設(shè)置where子句)。(7)以CriterionQuery為參數(shù),調(diào)用EntityManager的createQuery()方法創(chuàng)建Query,剩下部分與前面JPQL查詢的步驟相同。條件查詢的示例privatevoidquery(){//打開EntityManager和事務(wù)

EntityManagerem=emf.createEntityManager();em.getTransaction().begin();//創(chuàng)建CriteriaBuilderCriteriaBuilderbuilder=em.getCriteriaBuilder();//創(chuàng)建CriteriaQuery,傳入的類型參數(shù)代表該條件查詢返回結(jié)果集里的元素類型

CriteriaQuery<Student>criteria=builder.createQuery(Student.class);//設(shè)置要查詢的根實體類

Root<Student>root=criteria.from(Student.class);//下面語句不是必須的,條件查詢默認(rèn)會查詢唯一的Root實體

criteria.select(root);//使用builder生成查詢條件

Predicatepred=builder.greaterThan(root.get(Student_.name),"a");//①//使用CriteriaQuery的where()方法添加查詢條件

criteria.where(pred);List<Student>list=em.createQuery(criteria).getResultList();}條件查詢CriteriaQuery代表一次查詢,它的主要作用就是組織查詢語句的各子句。因此它提供的方法大致對應(yīng)了select語句中的各個子句。select(Selection<?extendsT>selection):如果只要select單個實體或單個屬性,可使用該方法。multiselect(Selection<?>...selections):如果只要select多個實體或多個屬性、以及它們的組合,使用該方法。distinct(booleandistinct):用于去除重復(fù)行。對應(yīng)于select后的distinct關(guān)鍵字。from(Class<X>entityClass):用于設(shè)置查詢的根實體。對應(yīng)于查詢語句的from子句。where(Predicate...restrictions):設(shè)置查詢條件。對應(yīng)于為查詢語句設(shè)置where子句。groupBy(Expression<?>...grouping):設(shè)置分組。對應(yīng)于為查詢語句設(shè)置groupby子句。having(Predicate...restrictions):過濾分組。對應(yīng)于為查詢語句設(shè)置having子句。orderBy(Order...o):設(shè)置排序。對應(yīng)于為查詢語句設(shè)置orderby子句。Criteria說明Criteria包含如下常用方法:CriteriasetFirstResult(intfirstResult):設(shè)置查詢返回的第一行記錄。CriteriasetMaxResults(intmaxResults):設(shè)置查詢返回的記錄數(shù)。Criteriaadd(Criterioncirterion):添加過濾條件。CriteriaaddOrder(Orderorder):添加排序規(guī)則。Listlist():返回查詢結(jié)果。Predicate說明Predicate接口代表一個查詢條件,該查詢條件由CriteriaBuilder負(fù)責(zé)產(chǎn)生。它用于產(chǎn)生查詢條件。因此它包含了equal、notEqual、gt、greaterThan、ge、greaterThanOrEqualTo、lt、lessThan、le、lessThanOrEqualTo、between、like等生成查詢條件的方法CriteriaUpdate,CriteriaDeleteCriteriaUpdate、CriteriaDelete來執(zhí)行DML語句,由于update、delete語句所包含的子句更少,因此CriteriaUpdate與CriteriaDelete的方法較少:from(Class<T>entityClass):設(shè)置修改或刪除的實體。對應(yīng)于from子句。where(Expression<Boolean>restriction):為修改或刪除設(shè)置條件。對應(yīng)于where子句。set(Path<Y>attribute,Xvalue):CriteriaUpdate的方法、CriteriaDelete沒這個方法。用于為更新語句設(shè)置新的值,對應(yīng)于set子句(delete沒有set子句,因此CriteriaDelete沒這個方法)。select的用法如果需要在查詢多個屬性或多個實體、或查詢多個屬性和多個實體的組合,可使用CriteriaQuery的multiselect()方法,也可先用CriteriaBuilder的array()方法包裝多個表達(dá)式,然后調(diào)用CriteriaQuery的select()方法。條件查詢還允許將查詢出來的多個屬性封裝DTO對象,這樣查詢得到的結(jié)果集的元素就是DTO對象,而不再是數(shù)組。元組查詢元組查詢是multiselect的改進。JPA提供了一個Tuple接口,專門用于封裝多個屬性,這樣就無需額外的DTO類。多Root查詢Root代表了條件查詢要查詢的目標(biāo)實體,它是獲取屬性、屬性路徑、關(guān)聯(lián)的基礎(chǔ),通常來說每個條件查詢只需定義一個Root,但條件查詢也支持多Root查詢。如果要使用多Root查詢,則需要多次調(diào)用CriteriaQuery的from()方法,并使用multiselect選出多個Root實體(也可使用select()方法)。關(guān)聯(lián)Root對象是獲取關(guān)聯(lián)的基礎(chǔ),JPA提供了Join接口來代表關(guān)聯(lián),Root和Join都是From的子接口,F(xiàn)rom為建立關(guān)聯(lián)提供了各種Join方法。select語句:select*fromtableAxxxjointableB...,JPA的From對象代表了其中的from子句,from子句后面就是緊跟xxxjoin,因此JPA使用From對象來支持關(guān)聯(lián)(對應(yīng)于join子句)Fetch關(guān)聯(lián)為了支持Fetch關(guān)聯(lián)查詢,JPA為Root對象提供了fetch()方法,該方法將會返回一個Fetch對象。實際上fetch()方法來自Root和Fetch共同的父接口:FetchParent,因此Root和Fetch都可調(diào)用fetch()方法。FetchParent定義了如下幾類fetch()方法。fetch(XxxAttribute<?superX,?,Y>attribute,JoinTypejt):設(shè)置使用Fetch關(guān)聯(lián),該方法需要使用JPA的元模型。其中JoinType參數(shù)用于指定連接類型,該參數(shù)可以省略,如果省略該參數(shù),默認(rèn)使用內(nèi)連接。fetch(XxxAttribute<StringattributeName,JoinTypejt):設(shè)置使用Fetch關(guān)聯(lián),該方法直接需要String類型的屬性名。其中JoinType參數(shù)用于指定連接類型,該參數(shù)可以省略,如果省略該參數(shù),默認(rèn)使用內(nèi)連接。分組查詢CriteriaQuery提供了groupBy()方法進行分組;如果要執(zhí)行聚集運行,則需要使用CriteriaBuilder提供的min()、max()、avg()、count()、sum()、least()、greatest()方法,它們對應(yīng)于SQL支持聚集函數(shù),而greatest

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論