JPA - API Kriteria

API Kriteria adalah API standar yang digunakan untuk menentukan kueri untuk entitas. Ini adalah cara alternatif untuk mendefinisikan kueri JPQL. Kueri ini tipe-aman, dan portabel serta mudah dimodifikasi dengan mengubah sintaks. Mirip dengan JPQL, ini mengikuti skema abstrak (skema yang mudah diedit) dan objek yang disematkan. API metadata dicampur dengan API kriteria untuk membuat model entitas persisten untuk kueri kriteria.

Keuntungan utama dari API kriteria adalah kesalahan dapat dideteksi lebih awal selama waktu kompilasi. Kueri JPQL berbasis string dan kueri berbasis kriteria JPA memiliki kinerja dan efisiensi yang sama.

Sejarah API kriteria

API kriteria disertakan ke dalam semua versi JPA, sehingga setiap langkah API kriteria diberitahukan dalam spesifikasi JPA.

  • Di JPA 2.0, API kueri kriteria, standardisasi kueri dikembangkan.
  • Di JPA 2.1, Pembaruan dan penghapusan kriteria (pembaruan dan penghapusan massal) disertakan.

Struktur Query Kriteria

API Kriteria dan JPQL terkait erat dan diizinkan untuk mendesain menggunakan operator serupa dalam kueri mereka. Ini mengikuti paket javax.persistence.criteria untuk mendesain kueri. Struktur kueri berarti kueri kriteria sintaksis.

Kueri kriteria sederhana berikut mengembalikan semua contoh kelas entitas di sumber data.

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();

Kueri mendemonstrasikan langkah-langkah dasar untuk membuat kriteria.

  • Instance EntityManager digunakan untuk membuat objek CriteriaBuilder .
  • Instance CriteriaQuery digunakan untuk membuat objek kueri. Atribut objek kueri ini akan dimodifikasi dengan detail kueri.
  • Metode CriteriaQuery.from dipanggil untuk menyetel root kueri.
  • CriteriaQuery.select dipanggil untuk menyetel jenis daftar hasil.
  • Instance TypedQuery <T> digunakan untuk menyiapkan kueri untuk dieksekusi dan menentukan tipe hasil kueri.
  • getResultList pada objek TypedQuery <T> untuk menjalankan kueri. Kueri ini mengembalikan kumpulan entitas, hasilnya disimpan dalam Daftar.

Contoh API kriteria

Mari kita perhatikan contoh database karyawan. Mari kita asumsikan tabel jpadb.employee berisi catatan berikut:

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

Buat Proyek JPA di IDE eclipse bernama JPA_Eclipselink_Criteria. Semua modul proyek ini ditampilkan sebagai berikut:

Membuat Entitas

Buat paket bernama com.tutorialspoint.eclipselink.entity dibawah ‘src’ paket.

Buat kelas bernama Employee.javadi bawah paket yang diberikan. Entitas Karyawan kelas ditampilkan sebagai berikut:

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

File Persistence.xml diperlukan untuk mengkonfigurasi database dan pendaftaran kelas entitas.

Persistence.xml akan dibuat oleh eclipse IDE saat menjalankan Proyek JPA. Detail konfigurasi adalah spesifikasi pengguna. File persistence.xml ditampilkan sebagai berikut:

<?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>

Kelas layanan

Modul ini berisi kelas layanan, yang mengimplementasikan bagian kueri Kriteria menggunakan inisialisasi API MetaData. Buat paket bernama‘com.tutorialspoint.eclipselink.service’. Kelas bernamaCriteriaAPI.javadibuat di bawah paket yang diberikan. Kelas DAO ditampilkan sebagai berikut:

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( );
   }
}

Setelah kompilasi dan eksekusi program di atas, Anda akan mendapatkan output di panel konsol Eclipse IDE sebagai berikut:

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