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://: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
廣告