JPA开发文档大全_第1页
JPA开发文档大全_第2页
JPA开发文档大全_第3页
JPA开发文档大全_第4页
JPA开发文档大全_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JPA 体系架构 Entity Bean 定义对 Entity 中属性变量的访问 主键和实体标识( Primary Key and Entity Identity)EntityManager 配置和获得 EntityManager .5.65.73333577910101011131313141415151616171718JPA 开发文档(大全)这是一份比较全面的JPA文档,希望能够帮助大家,让大家更好的学习工作。1. 发展中的持久化技术 31.1 JDBC 1.2 关系对象映射( Object Relational Mapping ,

2、ORM)1.3 Java 数据对象( Java Data Object ,JDO) 1.4 Java Persistence API ( JPA) 4.2 Entity 的生命周期和状态 持久化 Entity(Persist) 获取 Entity 更新 Entity 删除 Entity 脱离 / 附合(Detach/Merge) JPA Que ry 5.1 Query 接口 简单查询 使用参数查询 排序(order by)查询部分属性 查询中使用构造器 (Constructor) 聚合查询 (Aggregation) 19202121批量更新 (Batch Up

3、date)批量删除 (Batch Remove)1.发展中的持久化技术5.8 关联 (join)5.9 比较 Entity JDBC很多企业应用的开发者选择使用 JDBC管理关系型数据库中的数据。JDBC支持处 理大量的数据,能够保证数据的一致性,支持信息的并发访问,提供 SQL 查询语言 查找数据。 JDBC 所使用的关系模型不是为保存对象而设计的,因此迫使开发者选择 在处理持久数据时放弃面向对象编程,或者自己去开发将面向对象特性(比如:类之 间的继承)和关系型数据库进行映射的专有解决方案。1.2 关系对象映射( Object Relational Mapping ,

4、ORM)ORM是目前完成对象和关系数据表之间的映射最好的一种技术,这些ORM框架处理对象和关系数据库之间的协调工作,将开发者从这部分工作中解脱出来,集中精 力处理对象模型。阻碍 ORM发展的问题是,现有的每一种 ORM产品都有自己特有的 API,开发者只能将自己的代码绑定到某一个框架提供商的接口上,这种状况形成了 厂商锁定,意味着一旦该框架提供商无法解决系统中出现的严重错误,或者因为其它 的原因转而采用其它的框架,将会给开发者的企业应用带来极大的困难,唯一的解决 办法是重写所有的持久化代码。1.3 Java 数据对象( Java Data Object , JDO)JDO 是 Java EE

5、标准中另外一个支持管理持久化数据的规范, JDO 规范使用和 JPA 非常类似的 API ,只是通常是通过 JCA 技术集成到应用服务器上。但是 JDO 是 针对轻量级容器而设计的,不能够支持容器级别的声明式安全、事务特性,也无法对 远程方法调用提供支持。1.4 Java Persistence API(JPA)EJB 3.0 规范由三部分组成:EJB3.0 Simplified API 、EJB 核心规范(EJB Core Con tracts and Requireme nts )和 JPA ( Java P ersiste nee API )。JPA 规范部分详 细的介绍了 JPA中实体

6、Bean的定义,并介绍了实体 Bean支持的注释、全新的查 询语言、实体管理接口、容器实现规范等内容。JPA标准制定过程中充分吸收了目前已经出现的所有持久化技术的所有优点,摒 弃了它们存在的局限,使JPA在简单易用、查询能力等方面表现突出。标准化JPA是JCP组织发布的Java EE标准之一,因此任何声称符合JPA标准的框架 都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够 经过少量的修改就能够在不同的 JPA框架下运行。对容器级特性的支持JPA框架中支持大数据集、事务、并发等容器级事务,这使得JPA超越了简单持 久化框架的局限,在企业应用发挥更大的作用。简单易用

7、,集成方便在JPA框架下创建实体和创JPA的主要目标之一就是提供更加简单的编程模型: 建Java类一样简单,没有任何的约束和限制,只需要使用 javax .p ersiste nce.E ntity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。可媲美JDBC的查询能力JPA 定义了独特的 JPQL( Java Persistenee Query Language),JPQL 是 EJB QL 的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的 表,

8、而且能够支持批量更新和修改、JOIN、GROUPY HAVING等通常只有SQL才能够提供的高级查询特性,甚至还能够支持子查询。支持面向对象的高级特性JPA中能够支持面向对象的高级特性,比如类之间的继承、多态和类之间的复杂 关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不 需要自行处理这些特性在关系数据库的持久化。2.JPA体系架构支持内容:JDBCORMJDOEJB 3( JPAJava对象NoYesYesYes高级0O原理NoYesYesYes事务完整性YesYesYesYes并发YesYesYesYes大数据集YesYesYesYes现有SchemaYesYes

9、YesYes关系型和非 关系型数据存储NoNoYesNo查询YesYesYesYes严格的标准/可移植NoNoYesYes简单易用YesYesYesYes表1持久化技术的优缺点JPA中定义一套类和接口用于实现持久化管理和对象 /关系的映射,下面这张图中显 示了 JPA的主要组件以及它们之间的相互关系。图1 JPA主要组件和相互关系? En tityMa nagerFactory是En tityMa nager 的工厂类,负责创建En tityMa nagerFactory En tityMa nager 对象。? En tityMa nager应用中使用的基本对象,通过它提供的相应方法可以En

10、 tityMa nager 还负责创En tityMa nager 是 JPA管理持久化对象,也可以新建或者删除持久化对象。建 Query 实例。在容器外使用时, EntityManagerFactory 和 EntityManager 之间是一对一的关系。?En tityEn tityMa nager,而在对象持En tityTra nsacti on 提供En tity 操作时需要的事务管理, 和 是一对一的关系。在查询操作时不需要使用 En tityTra nsacti on 久化、状态更新、对象删除等情况下则必须使用显式的使用En tityTra nsaction的相关方法管理事务。?

11、 QueryQuery是查询实体的接口, Query对象可以从EntityManager中获得。根据EJB 3.0规范中的描述,Query接口需要同时支持JPQL和原生态SQL两种 语法。P ersiste neePersistence是一个工具类,负责根据配置文件提供的参数创建EntityManagerFaetory对象。下面的代码演示了如何通过JPA提供的接口和JPQL查询语言完成实体查询和 更新的例子,例子中的代码假定运行在非 Java EE环境中。清单1在非Java EE环境使用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 是注入的, 辑要简单得多。容器中开发JPA应用时

14、的接口使用情况,由于容器中 事务也是声明式的,因此在容器中完成上面的业务逻清单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处理。但还是需要遵行一定的规则:Entity 类必须要有一个无参数的 public或者protected的Constructor 。如果在应用中需要将该Entity类分离出来在分布式环境中作为参数接口。传递,该 Entity Class 需要实现 java.io.SerialzableEntity

16、 类不可以是final,也不可有final的方法。abstract类和Concrete实体类都可以作为 Entity 类。Entity类中的属性变量不可以是public。Entity类的属性必须通过 getter/setter或者其他的商业方法获得。3.1定义对Entity中属性变量的访问在绝大部分的商业应用,开发人员都可以忽略这部分无需关心。但如果你需要编 写复杂的Entity类的话,你需要了解这个部分。复杂的Entity类是指在Entity类的getter/setter和商业方法中包含比较复杂的业务逻辑而不是仅仅返回/符值某个属性。在大部分的情况下,我们都建议使Entity类中setter

17、/getter中的逻辑尽可能简单,除了必要的校验符值外,不要包含复杂的业务逻辑,例如对关联的其他En tity类进行操作。但有些情况下,我们还是需要在Entity类的setter/getter 方法中包含商业逻辑。这时候,采用何种属性访问方式就可能会影响代码的性能甚至是逻辑正 确产生影响。EJB3持久化规范中,在默认情况下所有的属性都会自动的被持久化,除非属性变 量用Transient元数据进行了标注。针对可持久化属性定义了两种属性访问方式 (access): FIELD 和 PROPERTY如果采用access=FIELD, EJB3 Persistenee 运行环境直接访问对象 的属性变量

18、,而不是通过getter。这种访问方式也不要求每个属性必须有 getter/setter。如果需要在getter中包含商业逻辑,应该采用access=FIELD的方式。如果采用access=PROPERTY, EJB3 Persistenee运行环境将通过Entity类上的getter来访问对象的属性变量,这就要求每个属性变量要有 getter/setter方法。在EJB3中,默认的属性访问方式是 PROPERTYaccess=PROPERT时getter/setter的逻辑应该尽量简单。规范中access方式还有多一层含义。就是采用 access=FIELD时,元数据应该批 注在属性上。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默认方式)时,元数据应该批注在对应属性变量的 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 类中的属性变量可以是以下数据类型:? 原始数据类型和他们的对象类型? 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),而该属性对 应数据库表中的一列。使用简单主键,我们只需要用 ld元数据对一个属性变量或者 她的getter方法进行批注。当我们需要使用一个或多个属性变量(表中的一列或多列)联合起来作为主键, 我们需要使用复合主键。复合主键要求我们编写一个复合主键类(Comp osite Primary Key Class )。复合主键类需要符合以下一些要求:复合主键类必须是P ublic和具备一个没有参数的constructor复合主键类的每个属性变量必须有getter/setter ,如果没有,每个属性变量则必须是public或者protected复合主键类必须实现java.io.s

23、erializable复合主键类必须实现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运行环境中的所有 Entity 。 EntityManager 根据运行的环境不同分为容器管理的 EntityManager 和应用管理的 EntityManager 。4.1 配置和获得 EntityManager在 J2SE环境中,EJB3定义了一个 javax.persistence.Persistenee类用于启动EJB3运行环境。要获得 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根据获得的 persistence.xml 初始化4.2 Entity 的生命周期和状态在 EJB3 中定义了四种 Entity的状态:新实体(new)。Entity 由应用产生,和EJB3 Persistence 运行环境没有联系,

28、 也没有唯一的标示符 (Identity)持久化实体 (managed) 。新实体和 EJB3 Persistence 运行环境产生关联(通过 persist(), merge() 等方法 ), 在 EJB3 Persistence 运行环境中存在和被管理,标志是在 EJB3 Persistence 运行环境中有一个唯一的标示 (Identity) 分离的实体 (detached) 。 Entity 有唯一标示符, 但它的标示符不被 EJB3 Persistence 运行环境管理 , 同样的 该 Entity 也不被 EJB3 Persistence 运行环境管理。删除的实体 (removed

29、) 。 Entity 被 remove() 方法删除, 对应的纪录将会在当前事务提交的时候从数据库中删除。图 2 状态的转化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 的状态为 new entityManager.persist( hello );/ 这时 hello 的状态变为 managedmit();entityManager.close();/ 这时 hellow 的状态变为 detached.当保存一个 Entity 时,以该对象为根对象的整个对象图都会自动的被保存。 但在 EJB3中,我们仍然可以通过关系元数据(比如 OneToOne,OneToMan的cascade属性 来精确定义保存的

31、级联行为。 下面我们来看看不同的 cascade 属性的区别。不配置 cascade 的情况下, EJB3Persistence 运行环境默认不会采用 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;现在来保存一个 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关联的mySon不会被自动保存,需要分别保存 manager.persist

33、( mySon );manager.getTransaction().commit();manager.close();现在我们配置 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属性,关联的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 中一样,关系元数据的 cascade 属性对是否集联删除

37、有影响。transaction.begin();Father father = manager.find( Father.class, 1 );/ 更新原始数据类型 father.setName( newName );/ 更新对象引用 Son newSon = new Son(); father.setSon( newSon );/ 提交事务,刚才的更新同步到数据库 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 );/ 提交事务,刚才的更新同步到数据库 mit();4.7 脱离/ 附合(Detach/Merge)在三层或者分布式应用中,我们很多时候需要 Entity 能脱离 EntityManager ,避 免长时间保持EntityManager打开占用资源和可以在不同的 JVM之间传递Entity 。在脱离 EJB3 Per

39、sistence Runtime(EntityManager) 的管理后 , 我们仍然可以读取 或者修改 Entity 中的内容。而在稍后的时间,我们又可以将 Entity 重新和原有或者 新的 EntityManager 附合,如果附合前 Entity 被改动过,更改的数据可以自动的被 发现并和数据库同步。EntityManager entityManager = emf.createEntityManager();/ 这时 Father 还是被 EntityManager 管理的 Father father = manager.find( Father.class, 1 );/ 当 ent

40、ityManger 关闭的时候,当前被 entityManager 管理的 Entity 都会自动的脱离 EntityManager ,状 态转变为 detachedentityManager.close();/ 脱离 EntityManager 后,我们仍然可以修改 Father 的属性 father.setName( newName );/ 在稍后的,我们可以将 father 重新附和到一个新的或者原来的 EntityManager 中 EntityManager newEntityManager = emf.createEntityManager();/附合( merge ) 需要在事务

41、中进行newEntityManager.getTransaction().begin();newEntityManager.merge( father );/ commit 后 father 中的被修改的内容会同步到数据库。 newEntityManager.getTransaction().commit();5.JPA QueryJPA的查询语言(JP)是一种和SQL非常类似的中间性和对象化查询语言。它可以 被编译成不同的底层数据库能接受的 SQL从而屏蔽不同数据库的差异,确保用 JPQL 查询语言编写的代码可在不同的数据库上运行。比起 EJB2.1的查询语言,EJB3可以 运行期构造,支持

42、多态,远远比 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 运行环境默 认会自动缓存每次查询的结果。这样下次同样的查询操作就无需访问数据库,而直接 从缓存中返回结果集合。但如果

45、在下次查询操作之前,有针对被缓存的 Entity 类进 行 update/insert/delete 操作,则缓存的结果集合会自动被清空,这样下次查询就 会从数据库获得数据, 确保查询总是获得正确的结果,避免缓存脏数据。有时候查询会返回海量的数据。注意关闭对集合结果的缓存。/ 假设返回的结果数量巨大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();/ 这里我们可以处理海量的数据 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 使用参数查询参数查询也和SQL中的参数查询类似。JPQL支持两种方式的参数定义方式:命名 参数和位置参数。在同一个查询中只允许使用一种参数定义方式。final Query query = entityManager.createQuery( select o from Order o where o.id = :myId);/ 设置查询中的参数 query.setParameter( myId, 2 );/ 可以使用多个参数final

49、 Query query = entityManager.createQuery( select o from Order o where o.id = :myId and o.customer = :customerName );/ 设置查询中的参数query.setParameter( myId, 2 ); query.setParameter( customerName, foo );final Query query = entityManager.createQuery( select o from Order o where o.id = ?1);/ 设置查询中的参数 query.

50、setParameter( 1, 2 );/ 1表示第一个参数, 2是参数的值/ 或者final Query query = entityManager.createQuery( select o from Order o where o.id = ?1).setParameter( 1, 2 );/final= ?2 );可以使用多个参数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 );设置查询中的参数如果在未来需要在不同的 EJB3 运行环境中运行,请使用位置参数, 可移植的。保证应用是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 对象数组 final List result = query.getResultList();/ 第一个行Object row = result.get( 0 );/ 数组中的第一个值是 idint id = I

54、nteger.parseInt( row0.toString() );String customerName = row1.toString();String streetNumber = Integer.parseInt( row2.toString() );5.6 查询中使用构造器 (Constructor)并产生实JPQL支持将查询的属性结果直接作为一个java class的构造器参数, 体作为结果返回。/ 我们把需要的三个属性作为一个 class( OrderHolder ) 的构造器参数,并使 用new函数。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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论