位置:首頁 > Java技術 > JPA教學 > JPA標準API

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<T>實例是用來準備一個查詢執行和指定的查詢結果的類型。

  • 在TypedQuery<T>對象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 文件的內容如下:

<?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.yiibai.eclipselink.entity.Employee</class>
   	<properties>
   		<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"/>
   	</properties>
   </persistence-unit>
</persistence>

服務類

該模塊包含服務類,它實現了使用元數據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