Hibernate: API Criteria de JPA

Explora el uso de Hibernate y la API Criteria de JPA para consultas dinámicas. Aprende cómo optimizar tus aplicaciones con ejemplos prácticos.

La API Criteria está diseñada para ser una alternativa a las consultas JPQL. Proporciona una forma tipada y segura en tiempo de compilación para construir consultas. Esto reduce los errores comunes como errores de sintaxis y proporciona una mayor flexibilidad.

Configuración inicial

Para utilizar la API Criteria, primero necesitamos crear una instancia de CriteriaBuilder y CriteriaQuery. Aquí tienes un ejemplo básico:

import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class CriteriaExample {

    public static void main(String[] args) {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();

        CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
        CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);
        Root<Employee> root = criteriaQuery.from(Employee.class);
        criteriaQuery.select(root);

        List<Employee> employees = session.createQuery(criteriaQuery).getResultList();

        employees.forEach(System.out::println);

        session.close();
        sessionFactory.close();
    }
}

En este ejemplo, CriteriaBuilder es la fábrica para construir consultas. CriteriaQuery define la consulta y Root representa la entidad desde la que se hará la selección.

Filtrado de datos

La API Criteria permite aplicar filtros mediante el uso de predicados. Aquí mostramos cómo agregar condiciones:

criteriaQuery.where(criteriaBuilder.equal(root.get("department"), "Sales"));

Este código agrega una condición para filtrar empleados que pertenecen al departamento de ventas.

Combinación de predicados

Es posible combinar múltiples predicados usando los métodos and y or:

Predicate departmentPredicate = criteriaBuilder.equal(root.get("department"), "Sales");
Predicate salaryPredicate = criteriaBuilder.greaterThan(root.get("salary"), 50000);

criteriaQuery.where(criteriaBuilder.and(departmentPredicate, salaryPredicate));

En este caso, la consulta solo devolverá empleados del departamento de ventas con un salario superior a 50,000.

Ordenación de resultados

Para ordenar los resultados, se puede usar el método orderBy:

criteriaQuery.orderBy(criteriaBuilder.asc(root.get("lastName")));

Este ejemplo ordena los resultados por el apellido en orden ascendente.

Paginación

La paginación es crucial para manejar grandes conjuntos de datos de manera eficiente. Hibernate permite paginar los resultados de la consulta de la siguiente manera:

Query<Employee> query = session.createQuery(criteriaQuery);
query.setFirstResult(0);
query.setMaxResults(10);

List<Employee> paginatedEmployees = query.getResultList();

Aquí, setFirstResult define el índice del primer resultado y setMaxResults define el número máximo de resultados a devolver.

Certifícate en Hibernate con CertiDevs PLUS

Lecciones de este módulo de Hibernate

Lecciones de programación del módulo API Criteria de JPA del curso de Hibernate.

Ejercicios de programación en este módulo de Hibernate

Evalúa tus conocimientos en API Criteria de JPA con ejercicios de programación API Criteria de JPA de tipo Test, Puzzle, Código y Proyecto con VSCode.