开发手册 欢迎您!
软件开发者资料库

JPA - Criteria API

JPA实体经理 - 使用这个初学者教程,简单易学地学习JPA,该教程包含从简介,架构,ORM组件,安装,实体管理器,JPQL,高级映射,实体关系和标准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 cq = 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