JPA - Kriterien-API
Die Kriterien-API ist eine vordefinierte API, mit der Abfragen für Entitäten definiert werden. Dies ist die alternative Methode zum Definieren einer JPQL-Abfrage. Diese Abfragen sind typsicher, portabel und können durch Ändern der Syntax leicht geändert werden. Ähnlich wie bei JPQL folgt es einem abstrakten Schema (einfach zu bearbeitendes Schema) und eingebetteten Objekten. Die Metadaten-API wird mit der Kriterien-API gemischt, um persistente Entitäten für Kriterienabfragen zu modellieren.
Der Hauptvorteil der Kriterien-API besteht darin, dass Fehler während der Kompilierungszeit früher erkannt werden können. Stringbasierte JPQL-Abfragen und JPA-kriterienbasierte Abfragen sind in Leistung und Effizienz gleich.
Verlauf der Kriterien API
Die Kriterien-API ist in allen Versionen von JPA enthalten, daher wird jeder Schritt der Kriterien-API in den Spezifikationen von JPA mitgeteilt.
- In JPA 2.0, der Kriterienabfrage-API, wird die Standardisierung von Abfragen entwickelt.
- In JPA 2.1 sind Kriterienaktualisierung und -löschung (Massenaktualisierung und -löschung) enthalten.
Struktur der Kriterienabfrage
Die Kriterien-API und JPQL sind eng miteinander verbunden und dürfen in ihren Abfragen ähnliche Operatoren verwenden. Es folgt dem Paket javax.persistence.criteria, um eine Abfrage zu entwerfen. Die Abfragestruktur bedeutet die Abfrage der Syntaxkriterien.
Die folgende einfache Kriterienabfrage gibt alle Instanzen der Entitätsklasse in der Datenquelle zurück.
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();
Die Abfrage zeigt die grundlegenden Schritte zum Erstellen eines Kriteriums.
- Die EntityManager- Instanz wird zum Erstellen eines CriteriaBuilder- Objekts verwendet.
- Die CriteriaQuery- Instanz wird zum Erstellen eines Abfrageobjekts verwendet. Die Attribute dieses Abfrageobjekts werden mit den Details der Abfrage geändert.
- Die Methode CriteriaQuery.from wird aufgerufen, um den Abfragestamm festzulegen.
- CriteriaQuery.select wird aufgerufen, um den Ergebnislistentyp festzulegen.
- Die Instanz TypedQuery <T> wird verwendet, um eine Abfrage für die Ausführung vorzubereiten und den Typ des Abfrageergebnisses anzugeben.
- getResultList- Methode für das TypedQuery <T> -Objekt zum Ausführen einer Abfrage. Diese Abfrage gibt eine Sammlung von Entitäten zurück. Das Ergebnis wird in einer Liste gespeichert.
Beispiel für Kriterien-API
Betrachten wir das Beispiel einer Mitarbeiterdatenbank. Nehmen wir an, die Tabelle jpadb.employee enthält folgende Datensätze:
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
Erstellen Sie ein JPA-Projekt in der Eclipse-IDE mit dem Namen JPA_Eclipselink_Criteria. Alle Module dieses Projekts werden wie folgt angezeigt:
Entitäten erstellen
Erstellen Sie ein Paket mit dem Namen com.tutorialspoint.eclipselink.entity unter ‘src’ Paket.
Erstellen Sie eine Klasse mit dem Namen Employee.javaunter gegebenem Paket. Die Entität class Employee wird wie folgt angezeigt:
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
Die Datei Persistence.xml ist erforderlich, um die Datenbank und die Registrierung von Entitätsklassen zu konfigurieren.
Persistence.xml wird von der Eclipse-IDE erstellt, während ein JPA-Projekt erstellt wird. Die Konfigurationsdetails sind Benutzerspezifikationen. Die Datei persistence.xml wird wie folgt angezeigt:
<?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>
Serviceklassen
Dieses Modul enthält die Serviceklassen, die den Kriterienabfrageteil mithilfe der MetaData-API-Initialisierung implementieren. Erstellen Sie ein Paket mit dem Namen‘com.tutorialspoint.eclipselink.service’. Die benannte KlasseCriteriaAPI.javawird unter gegebenem Paket erstellt. Die DAO-Klasse wird wie folgt angezeigt:
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( );
}
}
Nach dem Kompilieren und Ausführen des obigen Programms erhalten Sie folgende Ausgabe im Konsolenfenster von 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