首页 JPA_官方文档

JPA_官方文档

举报
开通vip

JPA_官方文档 JPA 教程 1.JPA概述 JPA(Java Persistence API)作为 Java EE 5.0平台标准的 ORM规范,将得到所有 Java EE服务器的支持。Sun这次吸取了之前 EJB规范惨痛失败的经历,在充分吸收现 有 ORM框架的基础上,得到了一个易于使用、伸缩性强的 ORM规范。从目 前的 开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为 ORM领域标准化 整合者的目标应该不难实现。 JPA通过 JDK 5.0注解或 XML描述对象-关系表的映射关系,并将运行期的...

JPA_官方文档
JPA 教程 1.JPA概述 JPA(Java Persistence API)作为 Java EE 5.0平台标准的 ORM规范,将得到所有 Java EE服务器的支持。Sun这次吸取了之前 EJB规范惨痛失败的经历,在充分吸收现 有 ORM框架的基础上,得到了一个易于使用、伸缩性强的 ORM规范。从目 前的 开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为 ORM领域标准化 整合者的目标应该不难实现。 JPA通过 JDK 5.0注解或 XML描述对象-关系 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 的映射关系,并将运行期的实体 对象持久化到数据库中,图 1很好地描述了 JPA的结构: Sun引入新的 JPA ORM规范出于两个原因:其一,简化现有 Java EE和 Java SE应 用的对象持久化的开发工作;其二,Sun希望整合对 ORM技术,实现天下归一。 JPA由 EJB 3.0软件专家组开发,作为 JSR-220实现的一部分。但它不囿于 EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为 POJO提供持久 化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运 行,方便 开发和测试的理念已经深入人心了。目前 Hibernate 3.2、TopLink 10.1.3以及 OpenJpa都提供了 JPA的实现。 JPA的总体思想和现有 Hibernate、TopLink,JDO等 ORM框架大体一致。总的来 说,JPA包括以下 3方面的技术: ORM映射元数据,JPA支持 XML和 JDK 5.0注解两种元数据的形式,元数据描述 对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; JPA 的 API,用来操作实体对象,执行 CRUD操作,框架在后台替我们完成所有 的事情,开发者从繁琐的 JDBC和 SQL代码中解脱出来。 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的 查询语言查询数据,避免程序的 SQL语句紧密耦合。 2.实体对象 访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。为了方便后面的讲解,我们用 论坛应用为例,建立以下的领域对象: Topic是论坛的主题,而 PollTopic是调查性质的论坛主题,它扩展于 Topic,一个 调查主题拥有多个选项 PollOption。这三个领域对象很好地展现了领域对象之间继 承和关联这两大核心的关系。这 3个领域对象将被映射到数据库的两张表中: 其中,Topic及其子类 PollTopic将映射到同一张 t_topic表中,并用 topic_type字段 区分两者。而 PollOption映射到 t_polloption中。 具有 ORM元数据的领域对象称为实体(Entity),按 JPA的规范,实体具备以下 的条件: 必须使用 javax.persistence.Entity注解或者在 XML映射文件中有对应的元素; 必须具有一个不带参的构造函数,类不能声明为 final,方法和需要持久化的属性 也不能声明为 final; 如果游离状的实体对象需要以值的方式进行传递,如通 Session bean的远程业务接 口传递,则必须实现 Serializable接口; 需要持久化的属性,其访问修饰符不能是 public,它们必须通过实体类方法进行访 问。 3.使用注解元数据 基本注解 首先,我们对 Topic领域对象进行注解,使其成为一个合格的实体类: 代码清单 1:Topic实体类的注解 package com.baobaotao.domain; … import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity(name = "T_TOPIC") ① public class Topic implements Serializable ...{ @Id ②-1 @GeneratedValue(strategy = GenerationType.TABLE) ②-2 @Column(name = "TOPIC_ID") ②-3 private int topicId; @Column(name = "TOPIC_TITLE", length = 100) ③ private String topicTitle; @Column(name = "TOPIC_TIME") @Temporal(TemporalType.DATE) ④ private Date topicTime; @Column(name = "TOPIC_VIEWS") private int topicViews; //省略 get/setter方法 } @Entity:将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类 名即为表名,通过 name属性显式指定表名,如①处的 name = "T_TOPIC",表示 Topic保存到 T_TOPIC表中; @Id :对应的属性是表的主键,如②-1所示; @GeneratedValue:主键的产生策略,通过 strategy属性指定。默认情况下,JPA自 动选择一个最适合底层数据库的主键生成策略,如 SqlServer对应 identity,MySql 对应 auto increment。在 javax.persistence.GenerationType中定义了以下几种可供选 择的策略: 1) IDENTITY:表自增键字段,Oracle不支持这种方式; 2) AUTO: JPA自动选择合适的策略,是默认选项; 3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名, MySql不支持这种方式; 4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使 应用更易于数据库移植。不同的 JPA实现商生成的表名是不同的,如 OpenJPA生 成 openjpa_sequence_table表 Hibernate生成一个 hibernate_sequences表,而 TopLink则生成 sequence表。这些表都具有一个序列名和对应值两个字段,如 SEQ_NAME和 SEQ_COUNT。 @Column(name = "TOPIC_ID"):属性对应的表字段。我们并不需要指定表字段的 类型,因为 JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可 以指定字段长度,以便可以自动生成 DDL语句,如③处所示; @Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型 有更严格的划分,所以必须指定具体时间类型,如④所示。在 javax.persistence.TemporalType枚举中定义了 3种时间类型: 1) DATE :等于 java.sql.Date 2) TIME :等于 java.sql.Time 3) TIMESTAMP :等于 java.sql.Timestamp 继承关系 Topic和 PollTopic是父子类,JPA 采用多种方法来支持实体继承。在父类中必须声 明继承实体的映射策略,如代码清单 2所示: 代码清单 2:继承实体的映射策略 … @Entity(name = "T_TOPIC") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ① @DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType = DiscriminatorType.INTEGER, length = 1) ② @DiscriminatorValue(value="1")③ public class Topic implements Serializable ...{ … } 对于继承的实体,在 javax.persistence.InheritanceType定义了 3种映射策略: SINGLE_TABLE:父子类都保存到同一个表中,通过字段值进行区分。这是我们 Topic实体所采用的策略, Topic和 PollTopic都保存到同一张表中,通过 TOPIC_TYPE字段进行区分,Topic在 T_TOPIC表中对应 TOPIC_TYPE= 1的记 录,而 PollTopic对应 TOPIC_TYPE=2的记录(稍后在 PollTopic实体中指定); 区别的字段通过 @DiscriminatorColumn说明,如②所示,区分字段对应该实体的 值通过@DiscriminatorValue指定,如③所示; JOINED:父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连 接获取完整数据; TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。 关联关系 我们再继续对 PollTopic进行注解,进一步了解实体继承的 JPA映射定义: 代码清单 3:PollTopic映射描述 package com.baobaotao.domain; … @Entity @DiscriminatorValue(value="2") ① public class PollTopic extends Topic ...{②继承于 Topic实 体 private boolean multiple; ③ @Column(name = "MAX_CHOICES") private int maxChoices; @OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④ private Set options = new HashSet(); //省略 get/setter方法 } 在①处,通过@DiscriminatorValue将区分字段 TOPIC_TYPE的值为 2。由于 PollTopic实体继承于 Topic实体,其它的元数据信息直接从 Topic获得。 JPA规范规定任何属性都默认映射到表中,所以虽然我们没有给③处的 multiple属 性提供注解信息,但 JPA将按照 默认的 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 对该字段进行映射:字段名和属性名 相同,类型相同。如果我们不希望将某个属性持久化到数据表中,则可以通过 @Transient注解显式指定: @Transient private boolean tempProp1; 在④处,我们通过@OneToMany指定了一个一对多的关联关系,一个 PollTopic包 括多个 PollOption对象(我们将在稍后的 PollOption中通过ManyToOne描述 PollOption和 PollTopic的关系,以建立 PollTopic和 PollOption的双向关联关 系)。 @OneToMany中通过 mappedBy属性指定“Many”方类引用“One”方类的属性名,这 里 mappedBy="pollTopic"表示 PollOption实体拥有一个指定 PollTopic的 pollTopic 属性。 下面,我们来看一下Many方 PollOption实体类的映射描述: 代码清单 4:PollOption映射描述 package com.baobaotao.domain; … @Entity(name="T_POLL_OPTION") public class PollOption implements Serializable ...{ @Id @GeneratedValue(strategy = GenerationType.TABLE) @Column(name = "OPTION_ID") private int optionId; @Column(name = "OPTION_ITEM") private String optionItem; @ManyToOne ① @JoinColumn(name="TOPIC_ID", nullable=false) ② private PollTopic pollTopic; } 在①处通过@ManyToOne描述了 PollOption和 PollTopic的多对一关联关系,并通 过@JoinColumn指定关联 PollTopic实体所对应表的“外键”,如②所示。 当然也可以通过@OneToOne和@ManyToMany指定一对一和多以多的关系,方法 差不多,不再赘述。 Lob字段 在 JPA中 Lob类型类型的持久化很简单,仅需要通过特殊的 Lob注解就可以达到 目的。下面,我们对 Post中的 Lob属性类型进行标注: 代码清单 5 Post:标注 Lob类型属性 package com.baobaotao.domain; … import javax.persistence.Basic; import javax.persistence.Lob; @Entity(name = "T_POST") public class Post implements Serializable ...{ … @Lob ①-1 @Basic(fetch = FetchType.EAGER) ①-2 @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ①-3 private String postText; @Lob ②-1 @Basic(fetch = FetchType. LAZY) ②-2 @Column(name = "POST_ATTACH", columnDefinition = "BLOB") ②-3 private byte[] postAttach; … } postText属性对应 T_POST表的 POST_TEXT字段,该字段的类型是 LONTTEXT,并且非空。JPA 通过@Lob将属性标注为 Lob类型,如①-1和②-1所 示。通过@Basic指定 Lob类型数据的获取策略,FetchType.EAGER表示非延迟 加 载,而 FetchType. LAZY表示延迟加载,如①-2和②-2所示。通过@Column的 columnDefinition属性指定数据表对应的 Lob字段类型,如①-3和② -3所示。 关于 JPA注解的更多信息,你可以通过这篇文章进行更加深入的学习:http: //www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa- annotations.html 4.使用 XML元数据 除了使用注解提供元数据信息外,JPA也允许我们通过 XML提供元数据信息。条 条道路通罗马,路路都是安康道,开发者安 全可以根据自己的习惯喜好择一而 从。按照 JPA的规范,如果你提供了 XML元数据描述信息,它将覆盖实体类中的 注解元数据信息。XML元数据信息以 orm.xml命名,放置在类路径的META-INF 目录下。 JPA尽量让 XML和注解的元数据在描述的结构上相近,降低学习曲线和转换难 度,所以我们在学习注解元数据后,学习 XML元数据变得非常简单。下面,我们 给出以上实体的 XML描述版本,你可以对照注解的描述进行比较学习: 代码清单 6 XML元数据配置:orm.xml ①实体对象所在的包 com.baobaotao.domain ②Topic实体配置 DATE ②PollTopic实体配置 2 ②PollOption实体配置
②Post实体配置
从代码清单 6中,我们可以看出 PollTopic并不需要通过特殊配置指定和 Topic 的继承关系,这些信息将从实体类反射信息获取。所以从严格意义上来说,元数据 信息或 XML和实体类结构信息共同构成的。 5.JPA的编程结构及重要的API JavaEE 5.0中所定义的JPA接口个数并不多,它们位于javax.persistence和 javax.persistence.spi两个包中。 javax.persistence包中大部分API都是注解类,除此之 外还包括EntityManager、Query等持久化操作接口。而 javax.persistence.spi包中的 4 个API,是JPA的服务层接口。下面,我们就来认识一下这些重要的接口。 EntityManager的类型 实体对象由实体管理器进行管理,JPA使用javax.persistence.EntityManager代表实 体管理器。实体管理器和持久化上下文关联,持久化上下文是一系列实体的管理环 境,我们通过EntityManager和持久化上下文进行交互。 有两种类型的实体管理器: 容器型:容器型的实体管理器由容器负责实体管理器之间的协作,在一个JTA事 务中,一个实体管理器的持久化上下文的状态会自动广播到所有使用EntityManager 的应用程序组件中。Java EE应用服务器提供的就是管理型的实体管理器; 应用程序型:实体管理器的生命周期由应用程序控制,应用程序通过 javax.persistence.EntityManagerFactory的createEntityManager创建EntityManager实 例。 EntityManager的创建过程 javax.persistence.spi.PersistenceProvider接口由 JPA的实现者提供,该接口由启动者 调用,以便创建一个 EntityManagerFactory实例。它定义了创建一个 EntityManagerFactory实例的方法: EntityManagerFactorycreateContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) javax.persistence.spi.PersistenceUnitInfo入参提供了创建实体管理器所需要的所有信 息,这些信息根据 JPA的规范,必须放置在META-INF/persistence.xml文件中。 PersistenceUnitInfo接口拥有了一个 void addTransformer(ClassTransformer transformer)方法,通过该方式可以添加一个 javax.persistence.spi.ClassTransformer, 并通过 PersistenceProvider开放给容器,以便容器在实体类文件加载到 JVM之前进 行代码的增强,使元数据生效。JPA厂商负责提供 ClassTransformer接口的实现。 图 4描述了创建 EntityManager的过程: 实体的状态 实体对象拥有以下 4个状态,这些状态通过调用 EntityManager接口方法发生迁 移: 新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联 起来。 受控态:已经拥有持久化主键并和持久化上下文建立了联系; 游离态:拥有持久化主键,但尚未和持久化上下文建立联系; 删除态:拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库 中删除。 EntityManager 的 API 下面是 EntityManager的一些主要的接口方法: void persist(Object entity) 通过调用 EntityManager的 persist()方法,新实体实例将转换为受控状态。这意谓着 当 persist ()方法所在的事务提交时,实体的数据将保存到数据库中。如果实体已经 被持久化,那么调用 persist()操作不会发生任何事情。如果对一个已经删除的 实体 调用 persist()操作,删除态的实体又转变为受控态。如果对游离状的实体执行 persist()操作,将抛出 IllegalArgumentException。 在一个实体上调用 persist()操作,将广播到和实体关联的实体上,执行相应的级联 持久化操作; void remove(Object entity) 通过调用 remove()方法删除一个受控的实体。如果实体声明为级联删除 (cascade=REMOVE 或者 cascade=ALL ),被关联的实体也会被删除。在一个新建状 态的实体上调用 remove()操作,将被忽略。如果在游离实体上调用 remove()操作, 将抛出 IllegalArgumentException,相关的事务将回滚。如果在已经删除的实体上执 行 remove()操作,也会被忽略; void flush() 将受控态的实体数据同步到数据库中; T merge(T entity) 将一个游离态的实体持久化到数据库中,并转换为受控态的实体; T find(Class entityClass, Object primaryKey) 以主键查询实体对象,entityClass是实体的类,primaryKey是主键值,如以下的代 码查询 Topic实体: Topic t = em.find(Topic.class,1); Query createQuery(String qlString) 根据 JPA的查询语句创建一个查询对象 Query,如下面的代码: Query q= em.createQuery(""SELECT t FROM Topic t WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString) 使用本地数据库的 SQL语句创建一个 Query对象,Query通过 getResultList()方法 执行查询后,返回一个 List结果集,每一行数据对应一个 Vector。 Query JPA使用 javax.persistence.Query接口代表一个查询实例,Query实例由 EntityManager通过指定查询语句构建。该接口拥有众多执行数据查询的接口方 法: ◆Object getSingleResult():执行 SELECT查询语句,并返回一个结果; ◆List getResultList() :执行 SELECT查询语句,并返回多个结果; ◆Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的 参数,如果查询语句使用了命令参数,则可以使用 Query setParameter(String name, Object value)方法绑定命名参数; ◆Query setMaxResults(int maxResult):设置返回的最大结果数; ◆int executeUpdate():如果查询语句是新增、删除或更改的语句,通过该方法执行 更新操作; 6.JPA的查询语言 JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询 语句,可以看成是 Hibernate HQL的等价物。 简单的查询 你可以使用以下语句返回所有 Topic对象的记录: SELECT t FROM Topic t t表示 Topic的别名,在 Topic t是 Topic AS t的缩写。 如果需要按条件查询 Topic,我们可以使用: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1 通过WHERE指定查询条件,?1表示用位置标识参数,尔后,我们可以通过 Query 的 setParameter(1, "主题 1")绑定参数。而 DISTINCT表示过滤掉重复的数据。 如果需要以命名绑定绑定数据,可以改成以下的方式: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title 这时,需要通过 Query的 setParameter("title", "主题 1")绑定参数。 关联查询:从 One的一方关联到Many的一方 返回 PollOptions对应的 PollTopic对象,可以使用以下语句: SELECT DISTINCT p FROM PollTopic p, IN(p.options) o WHERE o.optionItem LIKE ?1 这个语法和 SQL以及 HQL都有很大的区别,它直接实体属性连接关联的实体,这 里我们通过 PollTopic的 options属性关联到 PollOption实体上,对应的 SQL语句 为: SELECT DISTINCT t0.TOPIC_ID, t0.TOPIC_TYPE, t0.TOPIC_TITLE, t0.TOPIC_TIME, t0.TOPIC_VIEWS, t0.MULTIPLE, t0.MAX_CHOICES FROM T_TOPIC t0, T_POLL_OPTION t1 WHERE (((t1.OPTION_ITEM LIKE ?) AND (t0.TOPIC_TYPE = ?)) AND (t1.TOPIC_ID = t0.TOPIC_ID)) 该查询语句的另外两种等价的写法分别是: SELECT DISTINCT p FROM PollTopic p JOIN p.options o WHERE o.optionItem LIKE ?1 和 SELECT DISTINCT p FROM PollTopic p WHERE p.options.optionItem LIKE ?1 关联查询:从Many的一方关联到 One的一方 从Many一方关联到 One一方的查询语句和前面所讲的也很相似。如我们希望查询 某一个调查主题下的所示调查项,则可以编写以下的查询语句: SELECT p FROM PollOption p JOIN p.pollTopic t WHERE t.topicId = :topicId 对应的 SQL语句为: SELECT t0.OPTION_ID, t0.OPTION_ITEM, t0.TOPIC_ID FROM T_POLL_OPTION t0, TOPIC t1 WHERE ((t1.TOPIC_ID = ?) AND ((t1.TOPIC_ID = t0.TOPIC_ID) AND (t1.TOPIC_TYPE = ?))) 使用其它的关系操作符 使用空值比较符,比如查询附件不空的所有帖子对象: SELECT p FROM Post p WHERE p.postAttach IS NOT NULL 范围比较符包括 BETWEEN..AND和>、>= 、<、<=、<>这些操作符。比如下面的 语句查询浏览次数在 100到 200之间的所有论坛主题: SELECT t FROM Topic t WHERE t.topicViews BETWEEN 100 AND 200 Query JPA使用 javax.persistence.Query接口代表一个查询实例,Query实例由 EntityManager通过指定查询语句构建。该接口拥有众多执行数据查询的接口方 法: ◆Object getSingleResult():执行 SELECT查询语句,并返回一个结果; ◆List getResultList() :执行 SELECT查询语句,并返回多个结果; ◆Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的 参数,如果查询语句使用了命令参数,则可以使用 Query setParameter(String name, Object value)方法绑定命名参数; ◆Query setMaxResults(int maxResult):设置返回的最大结果数; ◆int executeUpdate():如果查询语句是新增、删除或更改的语句,通过该方法执行 更新操作; 6.JPA的查询语言 JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询 语句,可以看成是 Hibernate HQL的等价物。 简单的查询 你可以使用以下语句返回所有 Topic对象的记录: SELECT t FROM Topic t t表示 Topic的别名,在 Topic t是 Topic AS t的缩写。 如果需要按条件查询 Topic,我们可以使用: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1 通过WHERE指定查询条件,?1表示用位置标识参数,尔后,我们可以通过 Query 的 setParameter(1, "主题 1")绑定参数。而 DISTINCT表示过滤掉重复的数据。 如果需要以命名绑定绑定数据,可以改成以下的方式: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title 这时,需要通过 Query的 setParameter("title", "主题 1")绑定参数。 关联查询:从 One的一方关联到Many的一方 返回 PollOptions对应的 PollTopic对象,可以使用以下语句: SELECT DISTINCT p FROM PollTopic p, IN(p.options) o WHERE o.optionItem LIKE ?1 这个语法和 SQL以及 HQL都有很大的区别,它直接实体属性连接关联的实体,这 里我们通过 PollTopic的 options属性关联到 PollOption实体上,对应的 SQL语句 为: SELECT DISTINCT t0.TOPIC_ID, t0.TOPIC_TYPE, t0.TOPIC_TITLE, t0.TOPIC_TIME, t0.TOPIC_VIEWS, t0.MULTIPLE, t0.MAX_CHOICES FROM T_TOPIC t0, T_POLL_OPTION t1 WHERE (((t1.OPTION_ITEM LIKE ?) AND (t0.TOPIC_TYPE = ?)) AND (t1.TOPIC_ID = t0.TOPIC_ID)) 该查询语句的另外两种等价的写法分别是: SELECT DISTINCT p FROM PollTopic p JOIN p.options o WHERE o.optionItem LIKE ?1 和 SELECT DISTINCT p FROM PollTopic p WHERE p.options.optionItem LIKE ?1 关联查询:从Many的一方关联到 One的一方 从Many一方关联到 One一方的查询语句和前面所讲的也很相似。如我们希望查询 某一个调查主题下的所示调查项,则可以编写以下的查询语句: SELECT p FROM PollOption p JOIN p.pollTopic t WHERE t.topicId = :topicId 对应的 SQL语句为: SELECT t0.OPTION_ID, t0.OPTION_ITEM, t0.TOPIC_ID FROM T_POLL_OPTION t0, TOPIC t1 WHERE ((t1.TOPIC_ID = ?) AND ((t1.TOPIC_ID = t0.TOPIC_ID) AND (t1.TOPIC_TYPE = ?))) 使用其它的关系操作符 使用空值比较符,比如查询附件不空的所有帖子对象: SELECT p FROM Post p WHERE p.postAttach IS NOT NULL 范围比较符包括 BETWEEN..AND和>、>= 、<、<=、<>这些操作符。比如下面的 语句查询浏览次数在 100到 200之间的所有论坛主题: SELECT t FROM Topic t WHERE t.topicViews BETWEEN 100 AND 200 Query JPA使用 javax.persistence.Query接口代表一个查询实例,Query实例由 EntityManager通过指定查询语句构建。该接口拥有众多执行数据查询的接口方 法: ◆Object getSingleResult():执行 SELECT查询语句,并返回一个结果; ◆List getResultList() :执行 SELECT查询语句,并返回多个结果; ◆Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的 参数,如果查询语句使用了命令参数,则可以使用 Query setParameter(String name, Object value)方法绑定命名参数; ◆Query setMaxResults(int maxResult):设置返回的最大结果数; ◆int executeUpdate():如果查询语句是新增、删除或更改的语句,通过该方法执行 更新操作; 6.JPA的查询语言 JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询 语句,可以看成是 Hibernate HQL的等价物。 简单的查询 你可以使用以下语句返回所有 Topic对象的记录: SELECT t FROM Topic t t表示 Topic的别名,在 Topic t是 Topic AS t的缩写。 如果需要按条件查询 Topic,我们可以使用: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1 通过WHERE指定查询条件,?1表示用位置标识参数,尔后,我们可以通过 Query 的 setParameter(1, "主题 1")绑定参数。而 DISTINCT表示过滤掉重复的数据。 如果需要以命名绑定绑定数据,可以改成以下的方式: SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title 这时,需要通过 Query的 setParameter("title", "主题 1")绑定参数。 关联查询:从 One的一方关联到Many的一方 返回 PollOptions对应的 PollTopic对象,可以使用以下语句: SELECT DISTINCT p FROM PollTopic p, IN(p.options) o WHERE o.optionItem LIKE ?1 这个语法和 SQL以及 HQL都有很大的区别,它直接实体属性连接关联的实体,这 里我们通过 PollTopic的 options属性关联到 PollOption实体上,对应的 SQL语句 为: SELECT DISTINCT t0.TOPIC_ID, t0.TOPIC_TYPE, t0.TOPIC_TITLE, t0.TOPIC_TIME, t0.TOPIC_VIEWS, t0.MULTIPLE, t0.MAX_CHOICES FROM T_TOPIC t0, T_POLL_OPTION t1 WHERE (((t1.OPTION_ITEM LIKE ?) AND (t0.TOPIC_TYPE = ?)) AND (t1.TOPIC_ID = t0.TOPIC_ID)) 该查询语句的另外两种等价的写法分别是: SELECT DISTINCT p FROM PollTopic p JOIN p.options o WHERE o.optionItem LIKE ?1 和 SELECT DISTINCT p FROM PollTopic p WHERE p.options.optionItem LIKE ?1 关联查询:从Many的一方关联到 One的一方 从Many一方关联到 One一方的查询语句和前面所讲的也很相似。如我们希望查询 某一个调查主题下的所示调查项,则可以编写以下的查询语句: SELECT p FROM PollOption p JOIN p.pollTopic t WHERE t.topicId = :topicId 对应的 SQL语句为: SELECT t0.OPTION_ID, t0.OPTION_ITEM, t0.TOPIC_ID FROM T_POLL_OPTION t0, TOPIC t1 WHERE ((t1.TOPIC_ID = ?) AND ((t1.TOPIC_ID = t0.TOPIC_ID) AND (t1.TOPIC_TYPE = ?))) 使用其它的关系操作符 使用空值比较符,比如查询附件不空的所有帖子对象: SELECT p FROM Post p WHERE p.postAttach IS NOT NULL 范围比较符包括 BETWEEN..AND和>、>= 、<、<=、<>这些操作符。比如下面的 语句查询浏览次数在 100到 200之间的所有论坛主题: SELECT t FROM Topic t WHERE t.topicViews BETWEEN 100 AND 200 Query JPA使用 javax.persistence.Query接口代表一个查询实例,Query实例由 EntityManager通过指定查询语句构建。该接口拥有众多执行数据查询的接口方 法: ◆Object getSingleResult():执行 SELECT查询语句,并返回一个结果; ◆List getResultList() :执行 SELECT查询语句,并返回多个结果; ◆Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的 参数,如果查询语句使用了命令参数,则可以使用 Query setParameter(Strin
本文档为【JPA_官方文档】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_340057
暂无简介~
格式:pdf
大小:278KB
软件:PDF阅读器
页数:29
分类:互联网
上传时间:2013-03-14
浏览量:212