JPA - Criteria API

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();

CriteriaQuery<Entity class> cq = cb.createQuery(Entity.class);
Root<Entity> from = cq.from(Entity.class);

cq.select(Entity);
TypedQuery<Entity> q = em.createQuery(cq);
List<Entity> allitems = q.getResultList();

该查询演示了创建的基本步骤一个标准.

  • EntityManager 实例用于创建 CriteriaBuilder 对象.

  • CriteriaQuery 实例用于创建一个查询对象.此查询对象的属性将使用查询的详细信息进行修改.

  • CriteriaQuery.from 方法被调用以设置查询根.

  • CriteriaQuery.select 被调用来设置结果列表类型.

  • TypedQuery< T> 实例用于准备执行查询并指定查询结果的类型.

  • getResultList 方法在 TypedQuery< T> 对象上执行查询.此查询返回实体集合,结果存储在List中.

条件API示例

让我们考虑一下员工数据库的例子.让我们假设jpadb.employee表包含以下记录:

Eid	Ename           Salary	Deg
401	Gopal	        40000	Technical Manager
402	Manisha	        40000	Proof reader
403	Masthanvali     35000	Technical Writer
404     Satish	        30000	Technical writer
405	Krishna	        30000	Technical Writer
406	Kiran	        35000	Proof 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;

@Entity
public 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 
&lt ; persistence-unit name ="Eclipselink_JPA"transaction-type ="RESOURCE_LOCAL"> 
< class> com.it1352.eclipselink.entity.Employee</class> 
<属性> 
< 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"/> 
</properties> 
</persistence-unit> 
</persistence>

服务类

此模块包含服务类,它使用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