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