版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、JPA 體系架構 Entity Bean 定義對 Entity 中屬性變量的訪問 主鍵和實體標識( Primary Key and Entity Identity)EntityManager 配置和獲得 EntityManager .5.65.73333577910101011131313141415151616171718JPA 開發(fā)文檔(大全)這是一份比較全面的JPA文檔,希望能夠幫助大家,讓大家更好的學習工作。1. 發(fā)展中的持久化技術 31.1 JDBC 1.2 關系對象映射( Object Relational Mapping ,
2、ORM)1.3 Java 數(shù)據(jù)對象( Java Data Object ,JDO) 1.4 Java Persistence API ( JPA) 4.2 Entity 的生命周期和狀態(tài) 持久化 Entity(Persist) 獲取 Entity 更新 Entity 刪除 Entity 脫離 / 附合(Detach/Merge) JPA Que ry 5.1 Query 接口 簡單查詢 使用參數(shù)查詢 排序(order by)查詢部分屬性 查詢中使用構造器 (Constructor) 聚合查詢 (Aggregation) 19202121批量更新 (Batch Up
3、date)批量刪除 (Batch Remove)1.發(fā)展中的持久化技術5.8 關聯(lián) (join)5.9 比較 Entity JDBC很多企業(yè)應用的開發(fā)者選擇使用 JDBC管理關系型數(shù)據(jù)庫中的數(shù)據(jù)。JDBC支持處 理大量的數(shù)據(jù),能夠保證數(shù)據(jù)的一致性,支持信息的并發(fā)訪問,提供 SQL 查詢語言 查找數(shù)據(jù)。 JDBC 所使用的關系模型不是為保存對象而設計的,因此迫使開發(fā)者選擇 在處理持久數(shù)據(jù)時放棄面向對象編程,或者自己去開發(fā)將面向對象特性(比如:類之 間的繼承)和關系型數(shù)據(jù)庫進行映射的專有解決方案。1.2 關系對象映射( Object Relational Mapping ,
4、ORM)ORM是目前完成對象和關系數(shù)據(jù)表之間的映射最好的一種技術,這些ORM框架處理對象和關系數(shù)據(jù)庫之間的協(xié)調工作,將開發(fā)者從這部分工作中解脫出來,集中精 力處理對象模型。阻礙 ORM發(fā)展的問題是,現(xiàn)有的每一種 ORM產(chǎn)品都有自己特有的 API,開發(fā)者只能將自己的代碼綁定到某一個框架提供商的接口上,這種狀況形成了 廠商鎖定,意味著一旦該框架提供商無法解決系統(tǒng)中出現(xiàn)的嚴重錯誤,或者因為其它 的原因轉而采用其它的框架,將會給開發(fā)者的企業(yè)應用帶來極大的困難,唯一的解決 辦法是重寫所有的持久化代碼。1.3 Java 數(shù)據(jù)對象( Java Data Object , JDO)JDO 是 Java EE
5、標準中另外一個支持管理持久化數(shù)據(jù)的規(guī)范, JDO 規(guī)范使用和 JPA 非常類似的 API ,只是通常是通過 JCA 技術集成到應用服務器上。但是 JDO 是 針對輕量級容器而設計的,不能夠支持容器級別的聲明式安全、事務特性,也無法對 遠程方法調用提供支持。1.4 Java Persistence API(JPA)EJB 3.0 規(guī)范由三部分組成:EJB3.0 Simplified API 、EJB 核心規(guī)范(EJB Core Con tracts and Requireme nts )和 JPA ( Java P ersiste nee API )。JPA 規(guī)范部分詳 細的介紹了 JPA中實體
6、Bean的定義,并介紹了實體 Bean支持的注釋、全新的查 詢語言、實體管理接口、容器實現(xiàn)規(guī)范等內容。JPA標準制定過程中充分吸收了目前已經(jīng)出現(xiàn)的所有持久化技術的所有優(yōu)點,摒 棄了它們存在的局限,使JPA在簡單易用、查詢能力等方面表現(xiàn)突出。標準化JPA是JCP組織發(fā)布的Java EE標準之一,因此任何聲稱符合JPA標準的框架 都遵循同樣的架構,提供相同的訪問 API,這保證了基于JPA開發(fā)的企業(yè)應用能夠 經(jīng)過少量的修改就能夠在不同的 JPA框架下運行。對容器級特性的支持JPA框架中支持大數(shù)據(jù)集、事務、并發(fā)等容器級事務,這使得JPA超越了簡單持 久化框架的局限,在企業(yè)應用發(fā)揮更大的作用。簡單易用
7、,集成方便在JPA框架下創(chuàng)建實體和創(chuàng)JPA的主要目標之一就是提供更加簡單的編程模型: 建Java類一樣簡單,沒有任何的約束和限制,只需要使用 javax .p ersiste nce.E ntity進行注釋;JPA的框架和接口也都非常簡單,沒有太多特別的規(guī)則和設計模式的要求,開發(fā)者可以很容易的掌握。JPA基于非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。可媲美JDBC的查詢能力JPA 定義了獨特的 JPQL( Java Persistenee Query Language),JPQL 是 EJB QL 的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數(shù)據(jù)庫的 表,
8、而且能夠支持批量更新和修改、JOIN、GROUPY HAVING等通常只有SQL才能夠提供的高級查詢特性,甚至還能夠支持子查詢。支持面向對象的高級特性JPA中能夠支持面向對象的高級特性,比如類之間的繼承、多態(tài)和類之間的復雜 關系,這樣的支持能夠讓開發(fā)者最大限度的使用面向對象的模型設計企業(yè)應用,而不 需要自行處理這些特性在關系數(shù)據(jù)庫的持久化。2.JPA體系架構支持內容:JDBCORMJDOEJB 3( JPAJava對象NoYesYesYes高級0O原理NoYesYesYes事務完整性YesYesYesYes并發(fā)YesYesYesYes大數(shù)據(jù)集YesYesYesYes現(xiàn)有SchemaYesYes
9、YesYes關系型和非 關系型數(shù)據(jù)存儲NoNoYesNo查詢YesYesYesYes嚴格的標準/可移植NoNoYesYes簡單易用YesYesYesYes表1持久化技術的優(yōu)缺點JPA中定義一套類和接口用于實現(xiàn)持久化管理和對象 /關系的映射,下面這張圖中顯 示了 JPA的主要組件以及它們之間的相互關系。圖1 JPA主要組件和相互關系? En tityMa nagerFactory是En tityMa nager 的工廠類,負責創(chuàng)建En tityMa nagerFactory En tityMa nager 對象。? En tityMa nager應用中使用的基本對象,通過它提供的相應方法可以En
10、 tityMa nager 還負責創(chuàng)En tityMa nager 是 JPA管理持久化對象,也可以新建或者刪除持久化對象。建 Query 實例。在容器外使用時, EntityManagerFactory 和 EntityManager 之間是一對一的關系。?En tityEn tityMa nager,而在對象持En tityTra nsacti on 提供En tity 操作時需要的事務管理, 和 是一對一的關系。在查詢操作時不需要使用 En tityTra nsacti on 久化、狀態(tài)更新、對象刪除等情況下則必須使用顯式的使用En tityTra nsaction的相關方法管理事務。?
11、 QueryQuery是查詢實體的接口, Query對象可以從EntityManager中獲得。根據(jù)EJB 3.0規(guī)范中的描述,Query接口需要同時支持JPQL和原生態(tài)SQL兩種 語法。P ersiste neePersistence是一個工具類,負責根據(jù)配置文件提供的參數(shù)創(chuàng)建EntityManagerFaetory對象。下面的代碼演示了如何通過JPA提供的接口和JPQL查詢語言完成實體查詢和 更新的例子,例子中的代碼假定運行在非 Java EE環(huán)境中。清單1在非Java EE環(huán)境使用JPA接口的例子EntityManagerFaetory faetory = Persistenee.ere
12、ateEntityManagerFaetory ( “mysql” );/ 從 EntityManagerFaetory 實例 faetory 中獲取 EntityManagerEntityManager em = faetory.ereateEntityManager( PersistenceContextT yp e.EXTENDED);/實體的更新需要在事務中運行EntityTransaetion tx = em.getTransaetion (); tx.begin ();/查找所有公司中的女性雇員Query query = em.ereateQuery (select e from
13、Empio yee e where e.sex = femail); List results = query.getResultList ();/給所有女性雇員增加半天假期for (Objeet res : results)Empio yee emp = (Empio yee) res; emp .setHoliday (emp .getHoliday () +0.5);/tx.eommit (); em.elose (); faetory.elose ();提交事務(持久化所有更新)下面的代碼顯示了在EJB 的En tityMa nager 是注入的, 輯要簡單得多。容器中開發(fā)JPA應用時
14、的接口使用情況,由于容器中 事務也是聲明式的,因此在容器中完成上面的業(yè)務邏清單2在容器中運行的JPA/*在容器中運行JPA應用時,EntityManager 接口的實例” em *是通過Resource注釋注入的。事務也通常是聲明式的。例子*/查找所有公司中的女性雇員Query query = em.createQuery (select e from Empio yee e where e.sex = femail); List results = query.getResultList ();/給所有女性雇員增加半天假期for (Object res : results)Empio yee
15、 emp = (Empio yee) res;emp .setHoliday (emp .getHoliday () +0.5); 3.En tity BeanEJB3 Entity可以是很簡單的java bean,只要批注了 Entity或者在xml配置中 作了說明,就被做一個可持久化的Entity處理。但還是需要遵行一定的規(guī)則:Entity 類必須要有一個無參數(shù)的 public或者protected的Constructor 。如果在應用中需要將該Entity類分離出來在分布式環(huán)境中作為參數(shù)接口。傳遞,該 Entity Class 需要實現(xiàn) java.io.SerialzableEntity
16、 類不可以是final,也不可有final的方法。abstract類和Concrete實體類都可以作為 Entity 類。Entity類中的屬性變量不可以是public。Entity類的屬性必須通過 getter/setter或者其他的商業(yè)方法獲得。3.1定義對Entity中屬性變量的訪問在絕大部分的商業(yè)應用,開發(fā)人員都可以忽略這部分無需關心。但如果你需要編 寫復雜的Entity類的話,你需要了解這個部分。復雜的Entity類是指在Entity類的getter/setter和商業(yè)方法中包含比較復雜的業(yè)務邏輯而不是僅僅返回/符值某個屬性。在大部分的情況下,我們都建議使Entity類中setter
17、/getter中的邏輯盡可能簡單,除了必要的校驗符值外,不要包含復雜的業(yè)務邏輯,例如對關聯(lián)的其他En tity類進行操作。但有些情況下,我們還是需要在Entity類的setter/getter 方法中包含商業(yè)邏輯。這時候,采用何種屬性訪問方式就可能會影響代碼的性能甚至是邏輯正 確產(chǎn)生影響。EJB3持久化規(guī)范中,在默認情況下所有的屬性都會自動的被持久化,除非屬性變 量用Transient元數(shù)據(jù)進行了標注。針對可持久化屬性定義了兩種屬性訪問方式 (access): FIELD 和 PROPERTY如果采用access=FIELD, EJB3 Persistenee 運行環(huán)境直接訪問對象 的屬性變量
18、,而不是通過getter。這種訪問方式也不要求每個屬性必須有 getter/setter。如果需要在getter中包含商業(yè)邏輯,應該采用access=FIELD的方式。如果采用access=PROPERTY, EJB3 Persistenee運行環(huán)境將通過Entity類上的getter來訪問對象的屬性變量,這就要求每個屬性變量要有 getter/setter方法。在EJB3中,默認的屬性訪問方式是 PROPERTYaccess=PROPERT時getter/setter的邏輯應該盡量簡單。規(guī)范中access方式還有多一層含義。就是采用 access=FIELD時,元數(shù)據(jù)應該批 注在屬性上。ld
19、(ge nerate=Ge neratorTy pe.NONE)p rivate int id;p rivate String foo;/* The en tity class must have a n o-arg con structor.*/public HelloE ntityBea n() public in t getld() return id;采用access=PROPERT默認方式)時,元數(shù)據(jù)應該批注在對應屬性變量的 getter上。P rivate int id; p rivate Stri ng foo;/* The en tity class must have a n
20、o-arg con structor.*/public HelloE ntityBea n() Id(generate=GeneratorType.NONE) public int getId() return id;Entity 類中的屬性變量可以是以下數(shù)據(jù)類型:? 原始數(shù)據(jù)類型和他們的對象類型? java.lang.String? java.math.BigInteger? java.math.BigDecimal? java.util.Date? java.util.Calendar? java.sql.Date? java.sql.Time? java.sql.Timestamp? b
21、yte? Byte? char? Character? enums? Entity 類? 嵌入實體類 (embeddable classes)還可以是以下集合類型 :? java.util.Collection 和它的實體類? java.util.Set 和它的實體類? java.util.List 和它的實體類? java.util.Map 和它的實體類3.2 主鍵和實體標識( Primary Key and Entity Identity)每個Entity 類都必須有一個主鍵。在 EJB3中定義了兩種主鍵:鍵單主鍵和復合主鍵。簡單主鍵必須對應 Entity 中的一個屬性變量(Instane
22、e Variable),而該屬性對 應數(shù)據(jù)庫表中的一列。使用簡單主鍵,我們只需要用 ld元數(shù)據(jù)對一個屬性變量或者 她的getter方法進行批注。當我們需要使用一個或多個屬性變量(表中的一列或多列)聯(lián)合起來作為主鍵, 我們需要使用復合主鍵。復合主鍵要求我們編寫一個復合主鍵類(Comp osite Primary Key Class )。復合主鍵類需要符合以下一些要求:復合主鍵類必須是P ublic和具備一個沒有參數(shù)的constructor復合主鍵類的每個屬性變量必須有getter/setter ,如果沒有,每個屬性變量則必須是public或者protected復合主鍵類必須實現(xiàn)java.io.s
23、erializable復合主鍵類必須實現(xiàn)equals()和hashcode()方法復合主鍵類中的主鍵屬性變量的名字必須和對應的Entity中主鍵屬性變量的名字相同一旦主鍵值設定后,不要修改主鍵屬性變量的值復合主鍵的例子。Entity 類Person,它的主鍵屬性變量是 firstName和lastName。ldp rivate String firstName;Idp rivate String lastName;p ublic P erson() Person的復合主鍵類:P ublic class PersonPK imp leme nts java.io.Serializablep ri
24、vate Stri ng firstName; p rivate Stri ng lastName;public Perso nP K() public String getFirstName() return firstName;public void setFirstName(String firstName) this.firstName = firstName;public String getLastName() return lastName;public void setLastName(String lastName) this.lastName = lastName;4.En
25、tityManager對 Entity 進行操作的 API 都設計在 javax.persistence.EntityManager 接口上。 EntityManager ,顧名思義是管理所有 EJB 3運行環(huán)境中的所有 Entity 。 EntityManager 根據(jù)運行的環(huán)境不同分為容器管理的 EntityManager 和應用管理的 EntityManager 。4.1 配置和獲得 EntityManager在 J2SE環(huán)境中,EJB3定義了一個 javax.persistence.Persistenee類用于啟動EJB3運行環(huán)境。要獲得 EntityManager,首先需要通過 ja
26、vax.persistence.Persistence 獲得 EntityManagerFactory ,然后調用 EntityManagerFactory.createEntityManager() 方法獲得。/ 獲得默認當前的 EntityManagerFactoryfinal EntityManagerFactory emf =Persistence.createEntityManagerFactory();final EntityManager entityManager = emf.createEntityManager();的時候, Persistence 會做當調用 Persis
27、tence.createEntityManagerFactory() 以下的步驟:搜索當前 jar 包的 META-INFO/persistence.xml 配置文件如果沒有在 META-INFO下找到 persistence.xml,搜索當前線程的 ContextClassLoader 中的 persistence.xmlEntityManagerFactory根據(jù)獲得的 persistence.xml 初始化4.2 Entity 的生命周期和狀態(tài)在 EJB3 中定義了四種 Entity的狀態(tài):新實體(new)。Entity 由應用產(chǎn)生,和EJB3 Persistence 運行環(huán)境沒有聯(lián)系,
28、 也沒有唯一的標示符 (Identity)持久化實體 (managed) 。新實體和 EJB3 Persistence 運行環(huán)境產(chǎn)生關聯(lián)(通過 persist(), merge() 等方法 ), 在 EJB3 Persistence 運行環(huán)境中存在和被管理,標志是在 EJB3 Persistence 運行環(huán)境中有一個唯一的標示 (Identity) 分離的實體 (detached) 。 Entity 有唯一標示符, 但它的標示符不被 EJB3 Persistence 運行環(huán)境管理 , 同樣的 該 Entity 也不被 EJB3 Persistence 運行環(huán)境管理。刪除的實體 (removed
29、) 。 Entity 被 remove() 方法刪除, 對應的紀錄將會在當前事務提交的時候從數(shù)據(jù)庫中刪除。圖 2 狀態(tài)的轉化4.3 持久化 Entity(Persist)final EntityManagerFactory emf = Persistence.createEntityManagerFactory(); final EntityManager entityManager = emf.createEntityManager();final HelloEntityBean hello = new HelloEntityBean( 1, foo );EntityTransaction
30、trans = entityManager.getTransaction(); trans.begin();/ 持久化 hello, 在此操作之前 hello 的狀態(tài)為 new entityManager.persist( hello );/ 這時 hello 的狀態(tài)變?yōu)?managedmit();entityManager.close();/ 這時 hellow 的狀態(tài)變?yōu)?detached.當保存一個 Entity 時,以該對象為根對象的整個對象圖都會自動的被保存。 但在 EJB3中,我們仍然可以通過關系元數(shù)據(jù)(比如 OneToOne,OneToMan的cascade屬性 來精確定義保存的
31、級聯(lián)行為。 下面我們來看看不同的 cascade 屬性的區(qū)別。不配置 cascade 的情況下, EJB3Persistence 運行環(huán)境默認不會采用 Persistence by reachability 。public class FatherIdint idString name;/ OneToOne沒有配置 cascade 屬性,因此默認不會使用 Persistence by reachablityOneToOneSon mySonpublic Father( int id, String name, Son mySon ) this.id = id; = name;
32、this.mySon = mySon;現(xiàn)在來保存一個 Father 和 Son。final EntityManager manager = emf.createEntityManager(); manager.getTransaction().begin;Son mySon = new Son。;Father = new Father( 1, father mySon );/ 保存 Father manager.persist( father );/ 由于On eToO n關系中沒有配置casacade屬性father關聯(lián)的mySon不會被自動保存,需要分別保存 manager.persist
33、( mySon );manager.getTransaction().commit();manager.close();現(xiàn)在我們配置 casacde=CascadeType.ALLpublic class FatherIdint idString name;/OneToOn配置 cascade=CascadeType.ALL配置 cascade=CascadeType. PERSI也對 persist 操作也可以獲得同樣的效果。/ CascadeType.ALL包含 CascadeType.PERSISTOneToOne(cascade=CascadeType.ALL)Son mySonpub
34、lic Father( int id, String name, Son mySon ) this.id = id;this.mySon = mySon; = name;在代碼中同樣持久化 Father 和 mySon。final EntityManager manager = emf.createEntityManager(); manager.getTransaction().begin;Son mySon = new Son();Father = new Father( 1, mySon );保存Father。由于OneToOn關系中配置casacade=Cascad
35、eType.AL屬性,關聯(lián)的mySor會自動地被持久/化manager.persist( father ); manager.getTransaction().commit(); manager.close();建議在應用中盡可能使用 cascade=CascadeType.ALL 來減少持久化操作的復雜性 和代碼量,特別是在有復雜對象關系圖的時候。4.4 獲取 Entity如果知道 Entity 的唯一標示符,我們可以用 find() 方法來獲得 Entity 。Father father = manager.find( Father.class, new Integer( 1 ) );/由
36、于JDK1.5支持自動轉型,也可以如下使用/*Father father = manager.find( Father.class, 1 );或者,可以用Entity名字作為查找。但無法利用JDK 1.5的自動轉型功能,需要使用對象作為查找主鍵,并需要對獲得 Entity 進行轉型*/Father father = (Father)manager.find( com.redsoft.samples.Father, new Integer( 1 ) );4.5 更新 Entity對 Entity 的更新必須在事物內完成。和 persist 中一樣,關系元數(shù)據(jù)的 cascade 屬性對是否集聯(lián)刪除
37、有影響。transaction.begin();Father father = manager.find( Father.class, 1 );/ 更新原始數(shù)據(jù)類型 father.setName( newName );/ 更新對象引用 Son newSon = new Son(); father.setSon( newSon );/ 提交事務,剛才的更新同步到數(shù)據(jù)庫 mit();4.6 刪除 Entity對 Entity 的刪除必須在事物內完成。transaction.begin();Father father = manager.find( Father.class, 1 );/ 如果 fa
38、ther/son 的0neToOnecascade=CascadeType.ALL 在刪除 father 時候,也會把 son 刪除。 / 把 cascade 屬性設為 cascade=CascadeType.REMO有E同樣的效果。manager.remove( father );/ 提交事務,剛才的更新同步到數(shù)據(jù)庫 mit();4.7 脫離/ 附合(Detach/Merge)在三層或者分布式應用中,我們很多時候需要 Entity 能脫離 EntityManager ,避 免長時間保持EntityManager打開占用資源和可以在不同的 JVM之間傳遞Entity 。在脫離 EJB3 Per
39、sistence Runtime(EntityManager) 的管理后 , 我們仍然可以讀取 或者修改 Entity 中的內容。而在稍后的時間,我們又可以將 Entity 重新和原有或者 新的 EntityManager 附合,如果附合前 Entity 被改動過,更改的數(shù)據(jù)可以自動的被 發(fā)現(xiàn)并和數(shù)據(jù)庫同步。EntityManager entityManager = emf.createEntityManager();/ 這時 Father 還是被 EntityManager 管理的 Father father = manager.find( Father.class, 1 );/ 當 ent
40、ityManger 關閉的時候,當前被 entityManager 管理的 Entity 都會自動的脫離 EntityManager ,狀 態(tài)轉變?yōu)?detachedentityManager.close();/ 脫離 EntityManager 后,我們仍然可以修改 Father 的屬性 father.setName( newName );/ 在稍后的,我們可以將 father 重新附和到一個新的或者原來的 EntityManager 中 EntityManager newEntityManager = emf.createEntityManager();/附合( merge ) 需要在事務
41、中進行newEntityManager.getTransaction().begin();newEntityManager.merge( father );/ commit 后 father 中的被修改的內容會同步到數(shù)據(jù)庫。 newEntityManager.getTransaction().commit();5.JPA QueryJPA的查詢語言(JP)是一種和SQL非常類似的中間性和對象化查詢語言。它可以 被編譯成不同的底層數(shù)據(jù)庫能接受的 SQL從而屏蔽不同數(shù)據(jù)庫的差異,確保用 JPQL 查詢語言編寫的代碼可在不同的數(shù)據(jù)庫上運行。比起 EJB2.1的查詢語言,EJB3可以 運行期構造,支持
42、多態(tài),遠遠比 EJB2.1 的查詢更靈活和功能強大。 在程序中使用 JPQL 可以使用大寫(SELECT或者小寫(select),但不要大小寫(比如:Select)混合使用。5.1 Query 接口javax.persistence.Query是EJB3查詢操作的接口。進行查詢,首先要通過EntityManager 獲得 Query對象。public Query createQuery(String ejbqlString);下面我們做一個最簡單的查詢,查詢所有的 com.redsoft.samples.Order 類。final Query query = entityManager.cre
43、ateQuery( select o from Order o);final List result = query.getResultList();final Iterator iterator = result.iterator(); while( iterator.hasNext() )/ 處理 Order注意from Order。Order在 EJB3查詢中稱為 com.redsoft.samples.Order 類 的 abstract schemaType。查詢 Entity 在 JPQL中都是針對 Entity 的 Abstract Schema Type 進行查詢。 在同一個
44、EntityManagerFactory 中,不允許同時有兩個 Abstract Schema Type相同的 Entity 類。比如不允許同時有 com.redsoft.samples.Order 和 com.redsoft.foo.Order 。Query返回一個List的集合結果,我們可以用Iterator 或者List.get( int ) 的方法來獲得每個符合條件的 Entity 。如果查詢結果結合中包含所有符合條件的 Entity, EJB3 Persistence 運行環(huán)境默 認會自動緩存每次查詢的結果。這樣下次同樣的查詢操作就無需訪問數(shù)據(jù)庫,而直接 從緩存中返回結果集合。但如果
45、在下次查詢操作之前,有針對被緩存的 Entity 類進 行 update/insert/delete 操作,則緩存的結果集合會自動被清空,這樣下次查詢就 會從數(shù)據(jù)庫獲得數(shù)據(jù), 確保查詢總是獲得正確的結果,避免緩存臟數(shù)據(jù)。有時候查詢會返回海量的數(shù)據(jù)。注意關閉對集合結果的緩存。/ 假設返回的結果數(shù)量巨大final Query query = entityManager.createQuery( select o from Order o);/ 關閉對查詢結果的緩存query.setHint( Constants.QUERY_RESULT_CACHE, false); final List resu
46、lt = query.getResultList();final Iterator iterator = result.iterator();/ 這里我們可以處理海量的數(shù)據(jù) while( iterator.hasNext() )/ 處理 Order5.2 簡單查詢F面是一個簡單查詢的例子,可以看到和 SQL的使用方法很類似。final Query query = entityManager.createQuery( select o from Order o where o.id = 1);final Query query = entityManager.createQuery( selec
47、t o from Order o where o.id = 1 and o.confirm = true );final Query query = entityManager.createQuery( select o from Order o where o.id = 1 or o.customer = foo );/ address 是 Order 類上的一個對象變量屬性, Address 有一個 streetNumber 的屬性final Query query = entityManager.createQuery( select o from Order o where o.add
48、ress.streetNumber = 123 );注意條件語句中查詢的是 Entity 的屬性,屬性的名字需要和 Entity 中的屬性變 量名字一致。5.3 使用參數(shù)查詢參數(shù)查詢也和SQL中的參數(shù)查詢類似。JPQL支持兩種方式的參數(shù)定義方式:命名 參數(shù)和位置參數(shù)。在同一個查詢中只允許使用一種參數(shù)定義方式。final Query query = entityManager.createQuery( select o from Order o where o.id = :myId);/ 設置查詢中的參數(shù) query.setParameter( myId, 2 );/ 可以使用多個參數(shù)final
49、 Query query = entityManager.createQuery( select o from Order o where o.id = :myId and o.customer = :customerName );/ 設置查詢中的參數(shù)query.setParameter( myId, 2 ); query.setParameter( customerName, foo );final Query query = entityManager.createQuery( select o from Order o where o.id = ?1);/ 設置查詢中的參數(shù) query.
50、setParameter( 1, 2 );/ 1表示第一個參數(shù), 2是參數(shù)的值/ 或者final Query query = entityManager.createQuery( select o from Order o where o.id = ?1).setParameter( 1, 2 );/final= ?2 );可以使用多個參數(shù)Query query = entityManager.createQuery( select o from Order o where o.id= ?1 and o.customer/query.setParameter( 1, 2 ); query.se
51、tParameter( 2, foo );設置查詢中的參數(shù)如果在未來需要在不同的 EJB3 運行環(huán)境中運行,請使用位置參數(shù), 可移植的。保證應用是5.4 排序(order by)下面是一個簡單查詢的例子,可以看到和SQL的使用方法很類似。 分別為升序和降序,如果不顯式注明,JPQL中默認為asc升序。ASC和DESC/ 不注明的話,默認為 asc 為升序 ,final Query query = entityManager.createQuery( select o from Order o order by o.id);final Query query = entityManager.cr
52、eateQuery( select o from Order o order by o.address.streetNumber desc);/ desc 為降序final Query query = entityManager.createQuery( select o from Order o order by o.id, o.address.streetNumber);5.5 查詢部分屬性Entity 類Entity 。在前面的例子中,都是對針對 Entity 類的查詢,返回的也是被查詢的 的實體。JPQL也允許我們直接查詢返回我們需要的屬性,而不是返回整個 在一些 Entity 中屬性
53、特別多的情況,這樣的查詢可以提高性能。/ 直接查詢我們感興趣的屬性 ( 列)final Query query = entityManager.createQuery( select o.id, o.customerName, o.address.streetNumber from Order o order by o.id);/ 集合中的不再是 Order, 而是一個 Object 對象數(shù)組 final List result = query.getResultList();/ 第一個行Object row = result.get( 0 );/ 數(shù)組中的第一個值是 idint id = I
54、nteger.parseInt( row0.toString() );String customerName = row1.toString();String streetNumber = Integer.parseInt( row2.toString() );5.6 查詢中使用構造器 (Constructor)并產(chǎn)生實JPQL支持將查詢的屬性結果直接作為一個java class的構造器參數(shù), 體作為結果返回。/ 我們把需要的三個屬性作為一個 class( OrderHolder ) 的構造器參數(shù),并使 用new函數(shù)。Query query = entityManager.createQuery(selectnew com.redsoft.ejb3.dummy.OrderHolder ( o.id,o.vender, o.partNumber ) FROM Order AS o);/ 集合中的結果是 OrderHolder List result = query.getResultList();該 java class 不需要是 Entity Class 。 new要求 java class 使用全名。5.7 聚合查詢 (Aggregation)象大部
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中燃管道燃氣供用氣合同(家庭生活用氣)
- 商丘師范學院《BIM裝配式建筑結構設計》2023-2024學年第一學期期末試卷
- 商洛職業(yè)技術學院《建筑景觀照明設計》2023-2024學年第一學期期末試卷
- 低產(chǎn)土地回收合同范例
- 陜西職業(yè)技術學院《書籍形態(tài)設計》2023-2024學年第一學期期末試卷
- 陜西郵電職業(yè)技術學院《現(xiàn)代化學與中學化學》2023-2024學年第一學期期末試卷
- 商鋪裝修 出租合同范例
- 行政管理合同范例
- 2024至2030年牛皮紙袋項目投資價值分析報告
- 機電安裝工程預留預埋施工方法及工藝要求
- DB11 827-2011 廢舊爆炸物品銷毀處置安全規(guī)程
- 拒絕校園欺凌·守護身心健康(初高中版)
- 語 文病句專題講練-2024-2025學年統(tǒng)編版語文七年級上冊
- 第三單元(復習課件)一年級語文上冊(統(tǒng)編版2024秋)
- 2024年大學試題(計算機科學)-數(shù)字圖像處理考試近5年真題集錦(頻考類試題)帶答案
- 文旅深度融合長期發(fā)展規(guī)劃
- ASTM-D3359-(附著力測試標準)-中文版
- 5 協(xié)商決定班級事務 (教學設計)-2024-2025學年道德與法治五年級上冊統(tǒng)編版
- 2024年清潔機器人項目合作計劃書
- 高校實驗室安全通識課學習通超星期末考試答案章節(jié)答案2024年
- 銀行客戶經(jīng)理招聘面試題與參考回答(某大型集團公司)
評論
0/150
提交評論