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í.

  • thể EntityManager được sử dụng để tạo một đối tượng CriteriaBuilder .
  • 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