JPA - API de criterios

La API de criterios es una API predefinida que se utiliza para definir consultas para entidades. Es la forma alternativa de definir una consulta JPQL. Estas consultas son de tipo seguro, portátiles y fáciles de modificar cambiando la sintaxis. Similar a JPQL, sigue un esquema abstracto (esquema fácil de editar) y objetos incrustados. La API de metadatos se mezcla con la API de criterios para modelar la entidad persistente para las consultas de criterios.

La principal ventaja de la API de criterios es que los errores se pueden detectar antes durante el tiempo de compilación. Las consultas JPQL basadas en cadenas y las consultas basadas en criterios JPA son iguales en rendimiento y eficiencia.

Historial de criterios API

La API de criterios se incluye en todas las versiones de JPA, por lo tanto, cada paso de la API de criterios se notifica en las especificaciones de JPA.

  • En JPA 2.0, la API de consulta de criterios, se desarrolla la estandarización de consultas.
  • En JPA 2.1, se incluyen la actualización y eliminación de criterios (actualización y eliminación masiva).

Estructura de consulta de criterios

Criteria API y JPQL están estrechamente relacionados y se les permite diseñar utilizando operadores similares en sus consultas. Sigue el paquete javax.persistence.criteria para diseñar una consulta. La estructura de la consulta significa la consulta de criterios de sintaxis.

La siguiente consulta de criterios simples devuelve todas las instancias de la clase de entidad en la fuente de datos.

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

La consulta demuestra los pasos básicos para crear un criterio.

  • La instancia de EntityManager se utiliza para crear un objeto CriteriaBuilder .
  • La instancia de CriteriaQuery se utiliza para crear un objeto de consulta. Los atributos de este objeto de consulta se modificarán con los detalles de la consulta.
  • Se llama al método CriteriaQuery.from para establecer la raíz de la consulta.
  • Se llama a CriteriaQuery.select para establecer el tipo de lista de resultados.
  • La instancia de TypedQuery <T> se utiliza para preparar una consulta para su ejecución y especificar el tipo de resultado de la consulta.
  • getResultList en el objeto TypedQuery <T> para ejecutar una consulta. Esta consulta devuelve una colección de entidades, el resultado se almacena en una Lista.

Ejemplo de API de criterios

Consideremos el ejemplo de la base de datos de empleados. Supongamos que la tabla jpadb.employee contiene los siguientes registros:

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

Cree un proyecto JPA en el IDE de eclipse llamado JPA_Eclipselink_Criteria. Todos los módulos de este proyecto se muestran a continuación:

Creando Entidades

Crea un paquete llamado com.tutorialspoint.eclipselink.entity debajo ‘src’ paquete.

Crea una clase llamada Employee.javabajo paquete dado. La entidad clase Empleado se muestra a continuación:

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

Se requiere el archivo Persistence.xml para configurar la base de datos y el registro de clases de entidad.

Persistence.xml será creado por el IDE de eclipse mientras se desarrolla un proyecto JPA. Los detalles de configuración son especificaciones del usuario. El archivo persistence.xml se muestra a continuación:

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

Clases de servicio

Este módulo contiene las clases de servicio, que implementa la parte de consulta Criteria utilizando la inicialización de la API de MetaData. Crea un paquete llamado‘com.tutorialspoint.eclipselink.service’. La clase nombradaCriteriaAPI.javase crea bajo el paquete dado. La clase DAO se muestra a continuación:

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

Después de la compilación y ejecución del programa anterior, obtendrá una salida en el panel de la consola de Eclipse IDE de la siguiente manera:

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