该文翻译自网络,原文地址:
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
创建时,持久化提供者会初始化元模型类的属性。
(未待续完)
分享到:
相关推荐
1. **JPA是什么**:JPA是一种ORM(对象关系映射)框架,它允许Java开发者以面向对象的方式处理数据,将Java对象映射到数据库中的表,从而简化数据库操作。 2. **JPA起源**:JPA最初由Sun Microsystems开发,作为EJB...
Criteria API则提供了一个更强大且类型安全的查询构建方式。 5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行管理的。你可以使用`begin()`, `commit()`和`rollback()`方法来控制事务的...
JPA通过JPQL(Java Persistence Query Language)提供了一种面向对象的查询语言,使得开发者可以使用类似SQL的语法查询实体,而无需关心底层数据库的具体实现细节。 4. 准则API(Criteria API) 第九章“Criteria ...
在JPA 1.0中,JPQL是一种非常强大的查询语言,它允许开发者以面向对象的方式来构造查询。然而,JPQL查询是以字符串形式存在的,这就意味着即使语法错误也会被编译器忽略,只有在运行时才会抛出异常。如清单1所示: ...
JPA还提供了Criteria API,一种类型安全的查询方式,允许在编译时检查查询语法。Criteria API允许构建复杂的查询条件,动态组合查询,避免了字符串拼接引起的潜在错误。 3. **命名查询** 命名查询是在实体类的元...
- **Querydsl 扩展**:介绍了一个用于查询构建的类型安全查询构建器框架。 - **Web 支持**:提供了集成 Web 层与 Repository 层的方法。 - **Repository 填充器**:描述了填充 Repository 数据的策略。 - **遗留...
5. **查询语言(JPQL)**:介绍了Java Persistence Query Language,一种面向对象的查询语言,类似于SQL。 6. ** Criteria API**:提供了一种类型安全的方式来构建动态查询,避免了字符串拼接造成的错误。 ### 第二...
4. **继承支持**: 支持单表继承、联合继承和多表继承,允许在数据库设计中实现面向对象的继承结构。 5. **事务管理**: JPA与JTA(Java Transaction API)结合,可以方便地进行事务控制,确保数据的一致性。 ### ...
通过JPA,开发者可以使用面向对象的方式来处理数据库操作,而不是直接编写SQL语句。 2. **实体(Entity)**: 在JPA中,实体类是Java对象,它们代表数据库表中的记录。通过在类上使用`@Entity`注解,JPA知道这个类是...
Criteria API提供了一种更动态和类型安全的方式来构建查询。 7. **分页查询**:在描述中提到了分页查询,这通常通过`javax.persistence.Query`的`setFirstResult()`和`setMaxResults()`方法实现。这两个方法分别...
3. **JPA 查询**:JPA 支持两种主要的查询类型:原生 SQL 查询和 JPQL 查询。 - **Query 接口**:提供了执行查询的基础方法。 - **简单查询**:可以使用 Query 接口执行基本的查询操作。 - **使用参数查询**:...
**JPQL(Java Persistence Query Language)**是JPA中的查询语言,类似于SQL,但它是面向对象的,用来查询和操作持久化实体。与SQL不同的是,JPQL主要处理对象,而不是数据库表。在本课程"09_传智播客JPA详解_使用...
Querydsl是一个类型安全的查询语言,它可以与JPA、JDO、Hibernate等持久层技术配合使用,通过代码生成工具,将查询表达式转换为对应的SQL语句。Specification接口则是Spring Data JPA自带的一种动态查询方式,开发者...
3. **Querydsl**:Spring Data JPA可以与Querydsl结合使用,提供更强大的类型安全的查询能力。Querydsl允许开发者用Java对象表达复杂的查询语句,避免了SQL注入问题。 4. **Specifications**:Spring Data JPA的`...
9. ** Criteria API**:除了JPQL,JPA还提供了Criteria API,这是一种更强大且类型安全的查询方式,允许在运行时动态构建查询。 10. **命名查询(Named Queries)**:预先在实体类或persistence.xml文件中定义的...
- **元模型**:元模型是JPA 2.0引入的新特性,它允许开发者使用类型安全的方式进行查询操作。通过反射机制自动生成对应的元模型类,使得查询更加直观易读。 ##### 2. 查询 - **JPQL (Java Persistence Query ...
JPA通过提供对象/关系映射(ORM)功能,使得开发人员可以使用面向对象的方式来操作数据库,而无需直接编写SQL语句。JPA简化了数据访问,并且支持事务管理,使得在Java应用中处理数据库变得更加方便。 在描述的场景...
SpringBoot简化了Spring应用的初始设置和配置,而Java Persistence API (JPA) 是Java平台上的一个标准,用于对象关系映射(ORM),使得Java开发者能够以面向对象的方式处理数据库操作。 在"SpringBoot+JPA.zip"这个...
同时,Criteria API提供了一种类型安全的编程式查询方式。 **Hibernate特色功能:** 1. **HQL(Hibernate Query Language)**:Hibernate的扩展查询语言,比JPQL更强大,支持更多复杂的查询操作。 2. ** Criteria...
**JPA(Java Persistence API)**是Java平台上用于对象关系映射(ORM)的一个标准API,它为开发者提供了一种方便的方式来将Java类与数据库表进行对应,使得开发者可以使用面向对象的方式处理数据库操作,而无需过多...