- JPA 教程
- JPA - 首页
- JPA - 简介
- JPA - 架构
- JPA - ORM 组件
- JPA - 安装
- JPA - 实体管理器
- JPA - JPQL
- JPA - 高级映射
- JPA - 实体关系
- JPA - 标准查询API
- JPA 有用资源
- JPA - 快速指南
- JPA - 有用资源
JPA - 标准查询API
标准查询API是一个预定义的API,用于定义实体的查询。它是定义JPQL查询的另一种方式。这些查询类型安全、可移植且易于通过更改语法进行修改。类似于JPQL,它遵循抽象模式(易于编辑模式)和嵌入对象。元数据API与标准查询API混合以对标准查询的持久实体进行建模。
标准查询API的主要优势在于可以在编译时更早地检测到错误。基于字符串的JPQL查询和基于JPA标准查询的查询在性能和效率上是相同的。
标准查询API的历史
标准查询API包含在所有版本的JPA中,因此标准查询API的每个步骤都在JPA的规范中进行了说明。
- 在JPA 2.0中,开发了标准查询API,标准化了查询。
- 在JPA 2.1中,包含了标准查询更新和删除(批量更新和删除)。
标准查询结构
标准查询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> 对象上执行查询。此查询返回实体的集合,结果存储在列表中。
标准查询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
在Eclipse IDE中创建一个名为JPA_Eclipselink_Criteria的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文件。配置详细信息是用户指定的。Persistence.xml文件如下所示
<?xml version = "1.0" encoding = "UTF-8"?> <persistence version="2.0" xmlns = "http://java.sun.com/xml/ns/persistence" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name = "Eclipselink_JPA" transaction-type = "RESOURCE_LOCAL"> <class>com.tutorialspoint.eclipselink.entity.Employee</class> <properties> <property name = "javax.persistence.jdbc.url" value = "jdbc:mysql://127.0.0.1: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 name = "eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
服务类
此模块包含服务类,这些类使用元数据API初始化实现标准查询部分。创建一个名为‘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<Object> criteriaQuery = criteriaBuilder.createQuery(); Root<Employee> from = criteriaQuery.from(Employee.class); //select all records System.out.println(“Select all records”); 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()); } //Ordering the records System.out.println(“Select all records by follow ordering”); 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的控制台面板中获得以下输出
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