该文翻译自网络,原文地址:
http://www.developer.com/java/ent/article.php/3902911/Querying-in-JPA-2-Typesafe-and-Object-Oriented.htm
JPA流行的主要原因之一是JPQL,它支持面向对象的机制来查询数据库。但是JPQL有一个重大缺陷:作为查询字符串构建的JPQL查询在编译时不会被计算。JPA2.0引入了criteria 查询:一种类型安全和更面向对象的查询。使用criteria 查询,开发人员可以在编译时检查查询的正确与否。该特性以前只在像Hibernate这样的某些专用框架中可用。
在本文中,我将解释criteria 查询,并且浏览对构建criteria 查询非常有必要的元模型(metamodel)的概念。另外也会讨论criteria 查询的各种API。
元模型概念
在JPA2.0中,criteria 查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者映射的父类。简答点说,提供受管实体元信息的类就是元模型类。描述受管类的状态和它们之间的关系的静态元模型类可以:
l
从注解处理器产生
l
从程序产生
l
用EntityManager访问
考虑定义在包com.demo.entities中的实体类Employee
,假设该实体有诸如id,name和age的基本属性,还有与类Address的OneToMany关联。
package com.demo.entities;
@Entity
@Table
public class Employee{
private int id;
private String name;
private int age;
@OneToMany
private List<Address> addresses;
// Other code…
}
Employee类(com.demo.entities
包中定义)的标准元模型类的名字将是使用 javax.persistence.StaticMetamodel
注解的
Employee_。元模型类的属性全部是static和public的。Employee的每一个属性都会使用在JPA2规范中描述的以下规则在相应的元模型类中映射:
l
诸如id,name和age的非集合类型,会定义静态属性SingularAttribute<A, B> b,这里b是定义在类A中的类型为B的一个对象。
l
对于Addess这样的集合类型,会定义静态属性ListAttribute<A, B> b,这里List对象b是定义在类A中类型B的对象。其它集合类型可以是SetAttribute
, MapAttribute
或 CollectionAttribute
类型。
以下是用注解处理器产生的元模型类:
package com.demo.entities;
import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated("EclipseLink-2.1.0.v20100614-r7608 @ Tue Jul 27 10:13:02 IST 2010")
@StaticMetamodel(Employee.class)
public class Employee_ {
public static volatile SingularAttribute<Employee, Integer> id;
public static volatile SingularAttribute<Employee, Integer> age;
public static volatile SingularAttribute<Employee, String> name;
public static volatile ListAttribute<Employee, Address> addresses;
}
就像它的名字表明的,注解处理器处理注解,帮助产生源代码。注解处理在编译时就能激活。元模型类遵循JPA2.0规范中为定义标准元模型类而描述的规则创建。
使用元模型类最大的优势是凭借其实例化可以在编译时访问实体的持久属性。该特性使得criteria 查询更加类型安全。
元模型API与Java中的标准反射API密切相关。主要不同在于使用标准反射API编译器无法验证其正确性。例如:下面的代码会通过编译测试:
Class myClass = Class.forName("com.demo.Test");
Field myField = myClass.getField("myName");
编译器假定com.demo.Test中定义了属性myName,一旦该类并没有定义属性myName,编译器将抛出运行时异常。
元模型API会强制编译器检查适当的值是否分配给实体类的持久属性。例如:考虑Employee类的age属性,它是Integer变量。若该属性被赋值为String类型的值,编译器会抛出错误。该实现并不要求支持非标准特性。程序员编写的元模型类通常称为非标准元模型类。当EntityManagerFactory
创建时,持久化提供者会初始化元模型类的属性。
(未待续完)
分享到:
相关推荐
JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询...
JPA与Spring的相关配置 JPA 方法名常用查询 JPA 使用@Query注解实现JPQL和本地自定义查询 JPA API 条件查询 (子查询,多表连接查询) JPA结合QueryDSL轻松完成复杂查询(自连接,多表连接查询) 参与文档: Pro JPA2中文...
jpa入门案例:单表查询,包括分页查询 使用springboot来整合实现
相关文章: JPA标注 EJB的资料辅导(7) EJB的资料辅导(6) 推荐圈子: Database圈子 更多相关推荐 1.@Entity
如果编译器能够对查询执行语法正确性检查,那么对于Java 对象而言该查询就是类型安全的。 Java™Persistence API (JPA) 的2.0 版本引入了Criteria API,这个API 首次将类型安全查询引入到Java 应用程序 中,并为在...
JPA包括以下3方面的技术: RM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元...查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
JPA2教程,JPA标准参与者编写,全面接受JPA的方方面面。
包括:解析方法名称以自动生成查询、 NamedQueries、 @Query指定查询、本地查询、命名化参数、更新查询、创建查询的顺序等内容 第四章:客户化扩展JpaRepository 包括:讲述如何在JpaRepository基础上扩展我们自己...
jpa查询 jpql 本地查询 命名查询
JDK1.6的新特性: 注解 其中介绍了JPA框架中的常用注解
Jpa详细查询实例介绍,教你如何使用JPA,简单,分类实例。
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。 支持面向对象...
Java:trade_mark:PersistenceAPI(JPA)的2.0版本引入了CriteriaAPI,这个API首次将类型安全查询引入到Java应用程序中,并为在运行时动态地构造查询提供一种机制。本文介绍如何使用CriteriaAPI和与之密切相关的...
Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍.doc
Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA.doc
学习hibernate必读,包括JPA2新特征和JPA2映射的神秘之旅两个pdf。
介绍JPA2的一本很不错的英文书籍,可以作为一本权威参考。
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...