JPA - API tiêu chí
API tiêu chí là một API được xác định trước được sử dụng để xác định các truy vấn cho các thực thể. Đây là cách thay thế để xác định truy vấn JPQL. Các truy vấn này là loại an toàn, di động và dễ dàng sửa đổi bằng cách thay đổi cú pháp. Tương tự như JPQL, nó tuân theo lược đồ trừu tượng (lược đồ dễ chỉnh sửa) và các đối tượng nhúng. API siêu dữ liệu được kết hợp với API tiêu chí để tạo mô hình thực thể liên tục cho các truy vấn tiêu chí.
Ưu điểm chính của API tiêu chí là lỗi có thể được phát hiện sớm hơn trong thời gian biên dịch. Truy vấn JPQL dựa trên chuỗi và truy vấn dựa trên tiêu chí JPA giống nhau về hiệu suất và hiệu quả.
Lịch sử của API tiêu chí
API tiêu chí được bao gồm trong tất cả các phiên bản của JPA do đó mỗi bước của tiêu chí API được thông báo trong thông số kỹ thuật của JPA.
- Trong JPA 2.0, API truy vấn tiêu chí, tiêu chuẩn hóa các truy vấn được phát triển.
- Trong JPA 2.1, cập nhật và xóa tiêu chí (cập nhật và xóa hàng loạt) được bao gồm.
Cấu trúc truy vấn tiêu chí
API Criteria và JPQL có liên quan chặt chẽ với nhau và được phép thiết kế bằng cách sử dụng các toán tử tương tự trong các truy vấn của họ. Nó tuân theo gói javax.persistence.criteria để thiết kế một truy vấn. Cấu trúc truy vấn có nghĩa là truy vấn tiêu chí cú pháp.
Truy vấn tiêu chí đơn giản sau đây trả về tất cả các phiên bản của lớp thực thể trong nguồn dữ liệu.
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();
Truy vấn trình bày các bước cơ bản để tạo tiêu chí.
- Cá thể EntityManager được sử dụng để tạo một đối tượng CriteriaBuilder .
- Cá thể CriteriaQuery được sử dụng để tạo một đối tượng truy vấn. Các thuộc tính của đối tượng truy vấn này sẽ được sửa đổi với các chi tiết của truy vấn.
- Phương thức CriteriaQuery.from được gọi để đặt gốc truy vấn.
- CriteriaQuery.select được gọi để đặt kiểu danh sách kết quả.
- Thể hiện TypedQuery <T> được sử dụng để chuẩn bị một truy vấn để thực thi và chỉ định loại kết quả truy vấn.
- phương thức getResultList trên đối tượng TypedQuery <T> để thực hiện một truy vấn. Truy vấn này trả về một tập hợp các thực thể, kết quả được lưu trữ trong một Danh sách.
Ví dụ về API tiêu chí
Chúng ta hãy xem xét ví dụ về cơ sở dữ liệu nhân viên. Giả sử bảng jpadb.employee chứa các bản ghi sau:
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
Tạo một Dự án JPA trong IDE nhật thực có tên JPA_Eclipselink_Criteria. Tất cả các mô-đun của dự án này được hiển thị như sau:
Tạo thực thể
Tạo một gói có tên com.tutorialspoint.eclipselink.entity Dưới ‘src’ gói hàng.
Tạo một lớp có tên Employee.javatheo gói nhất định. Thực thể nhân viên của lớp được hiển thị như sau:
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
Tệp Persistence.xml được yêu cầu để cấu hình cơ sở dữ liệu và đăng ký các lớp thực thể.
Persistence.xml sẽ được tạo bởi IDE eclipse trong khi tạo một Dự án JPA. Các chi tiết cấu hình là đặc điểm kỹ thuật của người dùng. Tệp Persence.xml được hiển thị như sau:
<?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://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>
Các lớp dịch vụ
Mô-đun này chứa các lớp dịch vụ, thực hiện phần truy vấn Tiêu chí bằng cách sử dụng khởi tạo API MetaData. Tạo một gói có tên‘com.tutorialspoint.eclipselink.service’. Lớp có tênCriteriaAPI.javađược tạo theo gói nhất định. Lớp DAO được hiển thị như sau:
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( );
}
}
Sau khi biên dịch và thực thi chương trình trên, bạn sẽ nhận được kết quả đầu ra trong bảng điều khiển của Eclipse IDE như sau:
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