Criteria API是一个预定义的API,用于定义实体的查询.它是定义JPQL查询的另一种方法.这些查询是类型安全的,可移植且易于通过更改语法进行修改.与JPQL类似,它遵循抽象模式(易于编辑模式)和嵌入对象.元数据API与标准API混合,以便为标准查询建模持久实体.
标准API的主要优点是可以在编译期间更早地检测到错误.基于字符串的JPQL查询和基于JPA标准的查询在性能和效率上是相同的.
条件的历史API
条件API包含在所有版本中因此JPA的每一步都在JPA的规范中通知.
在JPA 2.0中,标准查询API,标准化为查询已开发.
在JPA 2.1中,包括条件更新和删除(批量更新和删除).
条件查询结构
Criteria API和JPQL密切相关,可以在查询中使用类似的运算符进行设计.它遵循javax.persistence.criteria包来设计查询.查询结构表示语法标准查询.
以下简单条件查询返回数据源中实体类的所有实例.
EntityManager em = ...;CriteriaBuilder cb = em.getCriteriaBuilder();CriteriaQuerycq = cb.createQuery(Entity.class);Root from = cq.from(Entity.class);cq.select(Entity);TypedQuery q = em.createQuery(cq);List allitems = q.getResultList();
该查询演示了创建的基本步骤一个标准.
EntityManager 实例用于创建 CriteriaBuilder 对象.
CriteriaQuery 实例用于创建一个查询对象.此查询对象的属性将使用查询的详细信息进行修改.
CriteriaQuery.from 方法被调用以设置查询根.
CriteriaQuery.select 被调用来设置结果列表类型.
TypedQuery< T> 实例用于准备执行查询并指定查询结果的类型.
getResultList 方法在 TypedQuery< T> 对象上执行查询.此查询返回实体集合,结果存储在List中.
条件API示例
让我们考虑一下员工数据库的例子.让我们假设jpadb.employee表包含以下记录:
EidEname SalaryDeg401Gopal 40000Technical Manager402Manisha 40000Proof reader403Masthanvali 35000Technical Writer404 Satish 30000Technical writer405Krishna 30000Technical Writer406Kiran 35000Proof reader
在名为 JPA_Eclipselink_Criteria 的eclipse IDE中创建JPA项目.该项目的所有模块如下所示:
创建实体
创建一个名为 com.it1352的包'src'包下的.eclipselink.entity .
在给定的包下创建一个名为 Employee.java 的类. Employee实体类如下所示:
package com.it1352.eclipselink.entity; import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entitypublic class Employee { @Id @GeneratedValue(strategy= GenerationType.AUTO) private int eid; private String ename; private double salary; private String deg; public Employee(int eid, String ename, double salary, String deg) { super( ); this.eid = eid; this.ename = ename; this.salary = salary; this.deg = deg; } public Employee( ) { super(); } public int getEid( ) { return eid; } public void setEid(int eid) { this.eid = eid; } public String getEname( ) { return ename; } public void setEname(String ename) { this.ename = ename; } public double getSalary( ) { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getDeg( ) { return deg; } public void setDeg(String deg) { this.deg = deg; } @Override public String toString() { return "Employee [eid = " + eid + ", ename = " + ename + ", salary = " + salary + ", deg = " + deg + "]"; }}
Persistence.xml
需要配置Persistence.xml文件数据库和实体类的注册.
Persistence.xml将由eclipse IDE在创建JPA项目时创建.配置详细信息是用户规范. persistence.xml文件如下所示:
<?xml version ="1.0"encoding ="UTF-8"?> < persistence version ="2.0"xmlns ="http://java.sun.com/xml/ns/persistence" xmlns:xsi ="https://img01.yuandaxia.cn/Content/img/tutorials/jpa/XMLSchema-实例" xsi:schemaLocation ="http://java.sun.com/xml/ns/persistence https://img01.yuandaxia.cn/Content/img/tutorials/jpa/index.html < ; persistence-unit name ="Eclipselink_JPA"transaction-type ="RESOURCE_LOCAL"> < class> com.it1352.eclipselink.entity.Employee <属性> < property name ="javax.persistence.jdbc.url"value ="jdbc:mysql://localhost:3306/jpadb"/> < property name ="javax. persistence.jdbc.user"value ="root"/> < property name ="javax.persistence.jdbc.password"value ="root"/> < property name =" javax.persistence.jdbc.driver" value ="com.mysql.jdbc.Driver"/> < property name ="eclipselink.logging.level"value ="FINE"/> < property na me ="eclipselink.ddl-generation" value ="create-tables"/>
服务类
此模块包含服务类,它使用MetaData API初始化实现Criteria查询部分.创建一个名为'com.it1352.eclipselink.service'的包.在给定包下创建名为 CriteriaAPI.java 的类. DAO类如下所示:
package com.it1352.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.it1352.eclipselink.entity.Employee; 公共类CriteriaApi { public static void main(String [] args){ EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("Eclipselink_JPA"); EntityManager entitymanager = emfactory.createEntityManager(); CriteriaBuilder criteriaBuilder = entitymanager.getCriteriaBuilder(); CriteriaQuery< Object> criteriaQuery = criteriaBuilder.createQuery(); Root< Employee> from = criteriaQuery.from(Employee.class); //选择所有记录 System.out.println("选择所有记录"); CriteriaQuery< Object> select = c riteriaQuery.select(from); TypedQuery< Object> typedQuery = entitymanager.createQuery(select); List< Object> resultlist = typedQuery.getResultList(); for(Object o:resultlist){ Employee e =(Employee)o; System.out.println("EID:"+ e.getEid()+"Ename:"+ e.getEname()); } //订购记录 System.out.println("按照订购选择所有记录"); CriteriaQuery< Object> select1 = criteriaQuery.select(from); select1.orderBy(criteriaBuilder.asc(from.get("ename"))); TypedQuery< Object> typedQuery1 = entitymanager.createQuery(select); List< Object> resultlist1 = typedQuery1.getResultList(); for(Object o:resultlist1){ Employee e =(Employee)o; System.out.println("EID:"+ e.getEid()+"Ename:"+ e.getEname()); } entitymanager.close(); emfactory.close(); } }
编译和执行上述程序后,您将在Eclipse IDE的控制台面板中输出如下内容:
选择所有记录 EID:401 Ename:Gopal EID:402 Ename:Manisha EID: 403 Ename:Masthanvali EID:404 Ename:Satish EID:405 Ename:Krishna EID:406 Ename:Kiran 选择所有记录按照订购 EID: 401 Ename:Gopal EID:406 Ename:Kiran EID:405 Ename:Krishna EID:402 Ename:Manisha EID:403 Ename:Masthanvali EID: 404 Ename:Satish