📅  最后修改于: 2020-11-13 05:06:53             🧑  作者: Mango
Criteria API是用于定义实体查询的预定义API。它是定义JPQL查询的另一种方法。这些查询是类型安全的,并且可移植且易于通过更改语法进行修改。与JPQL相似,它遵循抽象模式(易于编辑模式)和嵌入式对象。元数据API与标准API混合在一起,为标准查询建模持久性实体。
标准API的主要优点是可以在编译期间更早地检测到错误。基于字符串的JPQL查询和基于JPA标准的查询在性能和效率上都相同。
标准API包含在所有JPA版本中,因此在JPA规范中会通知标准API的每一步。
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();
该查询演示了创建条件的基本步骤。
让我们考虑员工数据库的示例。让我们假设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项目。该项目的所有模块如下所示:
在“ src”包下创建一个名为com.tutorialspoint.eclipselink.entity的包。
在给定的包下创建一个名为Employee.java的类。类Employee实体如下所示:
package com.tutorialspoint.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将在覆盖JPA项目时由Eclipse IDE创建。配置详细信息是用户规范。 persistence.xml文件如下所示:
com.tutorialspoint.eclipselink.entity.Employee
该模块包含服务类,该服务类使用MetaData API初始化实现Criteria查询部分。创建一个名为“ com.tutorialspoint.eclipselink.service”的包。在给定的包下创建了名为CriteriaAPI.java的类。 DAO类如下所示:
package com.tutorialspoint.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.tutorialspoint.eclipselink.entity.Employee;
public class CriteriaApi {
public static void main(String[] args) {
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.createEntityManager( );
CriteriaBuilder criteriaBuilder = entitymanager.getCriteriaBuilder();
CriteriaQuery
编译并执行上述程序后,您将在Eclipse IDE的控制台面板中获得输出,如下所示:
Select All records
EID : 401 Ename : Gopal
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish
EID : 405 Ename : Krishna
EID : 406 Ename : Kiran
Select All records by follow Ordering
EID : 401 Ename : Gopal
EID : 406 Ename : Kiran
EID : 405 Ename : Krishna
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish