目录[-]
序言
自工作以来,除了以前比较流量的hibernate,就是一直使用ORM 规范 JPA了.而这几天工作需要,研究了下JPA的标准查询,名为:JPA criteria查询.相比JPQL,其优势是类型安全,更加的面向对象.
使用标准查询,开发人员可在编译的时候就检查查询的正确与否.而以前也只是在Hibernate中听说有过.具体不详,没用过.
JPA元模型概念,及使用
在JPA中,标准查询是以元模型的概念为基础的.元模型是为具体持久化单元的受管实体定义的.这些实体可以是实体类,嵌入类或者映射的父类.提供受管实体元信息的类就是元模型类.
描述受管类的状态和他们之间的关系的静态元模型类可以
- 1.从注解处理器产生
- 2.从程序产生
- 3.用EntityManager访问.
如下code,一个简单的实体类package com.demo.entities;下,实体类Employee ,假设该实体有诸如id,name和age的基本属性,还有与类Address的OneToMany关联:
01 |
@Entity |
02 |
@Table |
03 |
public class Employee{ |
04 |
private int id; |
05 |
private String name; |
06 |
private int age; |
07 |
@OneToMany |
08 |
private List<Address> addresses; |
09 |
// Other code… |
10 |
} |
Employee类(com.demo.entities包中定义)的标准元模型类的名字将是使用 javax.persistence.StaticMetamodel注解的Employee_。元模型类的属性全部是static和public的。Employee的每一个属性都会使用在JPA2规范中描述的以下规则在相应的元模型类中映射:
- 诸如id,name和age的非集合类型,会定义静态属性SingularAttribute<A, B> b,这里b是定义在类A中的类型为B的一个对象。
- 对于Addess这样的集合类型,会定义静态属性ListAttribute<A, B> b,这里List对象b是定义在类A中类型B的对象。其它集合类型可以是SetAttribute, MapAttribute 或 CollectionAttribute 类型。
以下是用注解处理器产生的元模型类package com.demo.entities;下:
01 |
import javax.annotation.Generated; |
02 |
import javax.persistence.metamodel.SingularAttribute; |
03 |
import javax.persistence.metamodel.ListAttribute; |
04 |
import javax.persistence.metamodel.StaticMetamodel; |
05 |
@Generated ( "org.hibernate.jpamodelgen.JPAMetaModelEntityProcesso" ) |
06 |
@StaticMetamodel (Employee. class ) |
07 |
public class Employee_ { |
08 |
public static volatile SingularAttribute<Employee, Integer> id; |
09 |
public static volatile SingularAttribute<Employee, Integer> age; |
10 |
public |