JPA標準API

標準是用來定義查詢實體的預定義API。它是定義JPQL查詢的另一種方式。這些查詢是類型安全的,可移植的,並且容易被改變的語法進行修改。類似於JPQL,它遵循的抽象模式(容易編輯模式)和嵌入的對象。元數據API是夾雜着標準的API模型持久性實體的標準查詢。

標準的API的主要優點是,錯誤可以較早在編譯時被檢測到。基於字符串JPQL查詢和基於查詢JPA的範圍是在性能和效率相同。

標準API歷史

該標準被納入因此標準的每一步中JPA的規範通知所有版本JPA。

  • 在JPA2.0中,標準查詢API,查詢的標準化開發。
  • 在JPA2.1,標準更新和刪除(批量更新和刪除)都包括在內。

標準查詢結構

該標準與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.form方法被調用來設置查詢根。

  • CriteriaQuery.select被調用來設置結果列表類型。

  • TypedQuery實例是用來準備一個查詢執行和指定的查詢結果的類型。

  • 在TypedQuery對象getResultList方法來執行查詢。該查詢返回實體的集合,結果存儲在一個列表中。

標準API示例

讓我們考慮 employee 數據庫的例子。讓我們假定該 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.yiibai.eclipselink.entity

創建一個名爲Employee.java類。Employee實體如下圖所示:

package com.yiibai.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 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"> com.yiibai.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 name="eclipselink.ddl-generation" value="create-tables"/>

服務類

該模塊包含服務類,它實現了使用元數據API的初始化條件查詢的一部分。創建一個名爲「com.yiibai.eclipselink.service'包。在這個包下創建一個類CriteriaAPI.java。在DAO類如下所示:

package com.yiibai.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.yiibai.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 =criteriaQuery.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