Hibernate

Hibernate

Tutorial Hibernate: Consultas Criteria avanzadas

Hibernate Criteria avanzado: consultas complejas. Aprende a realizar consultas complejas en Hibernate utilizando Criteria avanzado con ejemplos detallados.

Introducción

Las consultas Criteria de JPA en Hibernate permiten explorar características más sofisticadas que aumentan la eficiencia y flexibilidad al interactuar con bases de datos. 

Al utilizar métodos avanzados del API Criteria, los desarrolladores pueden manejar complejidades adicionales sin comprometer la claridad del código ni la seguridad de tipos que ofrece Hibernate.

Asociaciones y Joins

Para manejar relaciones entre diferentes entidades, el API Criteria permite realizar varios tipos de joins, como inner joins, left joins y right joins. Estos se especifican a través de JoinType en la cláusula join() del objeto Root o Join.

// Ejemplo de inner join
Join<Empleado, Departamento> departamentoJoin = root.join("departamento", JoinType.INNER);

// Ejemplo de left join
Join<Empleado, Proyecto> proyectoJoin = root.join("proyectos", JoinType.LEFT);
  • JoinType.INNER: Se utiliza para devolver solo aquellos registros que tienen una correspondencia en ambas tablas relacionadas.
  • JoinType.LEFT: Devuelve todos los registros de la tabla izquierda y los registros coincidentes de la tabla derecha. Si no hay coincidencia, los resultados de la tabla derecha tendrán valores nulos.
  • JoinType.RIGHT: Devuelve todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda. Si no hay coincidencia, los resultados de la tabla izquierda tendrán valores nulos.

Full Join: En el API Criteria de Hibernate, no hay una implementación directa para JoinType.FULL como en SQL. En su lugar, se deberían combinar técnicas de LEFT y RIGHT joins manualmente para simular un FULL join.

Subqueries

Las subconsultas son una poderosa herramienta para realizar consultas más complejas dentro de una consulta principal. Se pueden crear utilizando subquery() del CriteriaBuilder, permitiendo operaciones como existencias, comparaciones y selecciones anidadas.

// Subconsulta para empleados con salario superior al promedio
Subquery<Double> subquery = cr.subquery(Double.class);
Root<Empleado> subroot = subquery.from(Empleado.class);
subquery.select(cb.avg(subroot.get("salario")));
cr.where(cb.greaterThan(root.get("salario"), subquery));

Transformadores

La transformación de resultados es crucial cuando se necesita personalizar la salida de la consulta, por ejemplo, hacia DTOs (Data Transfer Objects). Hibernate ofrece ResultTransformer para convertir los resultados brutos en entidades o DTOs personalizados.

// Uso de ResultTransformer para obtener un DTO
cr.setResultTransformer(new AliasToBeanResultTransformer(MiDTO.class));
List<MiDTO> resultados = session.createQuery(cr).getResultList();

Criterios de asociación con FetchMode

Optimizar la carga de asociaciones mediante diferentes estrategias de fetching es esencial para mejorar el rendimiento. FetchMode.JOIN y FetchMode.SELECT son dos modos que Hibernate ofrece para controlar cómo se recuperan las asociaciones.

// Fetch join para cargar todo en una sola consulta
root.fetch("departamento", JoinType.LEFT);

// Fetch select para cargar asociaciones por demanda
root.fetch("proyectos", FetchMode.SELECT);

En el primer caso no se utiliza FetchMode.JOIN directamente porque el API Criteria de Hibernate no ofrece una manera directa de especificar FetchMode cuando se utiliza el método fetch() en el objeto Root. En su lugar, se utiliza JoinType para controlar el tipo de join que se realizará en la consulta SQL subyacente. Utilizar el método fetch() con un JoinType en el API Criteria implica automáticamente un comportamiento de carga anticipada (“eager loading”).

La diferencia fundamental entre FetchMode y JoinType radica en cómo afectan al proceso de carga de las asociaciones:

  • FetchMode: Es una estrategia que indica cuándo se deben cargar las asociaciones (por ejemplo, “lazy loading” con FetchMode.SELECT o “eager loading” con FetchMode.JOIN), pero no especifica cómo se deben cargar físicamente esas asociaciones en la consulta SQL.
  • JoinType: Especifica cómo se realizará el join en la consulta SQL, como JoinType.INNER o JoinType.LEFT.

Consultas de proyección complejas

Combinar múltiples proyecciones permite realizar consultas avanzadas sobre los datos, como seleccionar múltiples campos o aplicar funciones de agregación en conjunto.

// Selección de múltiples campos con CriteriaQuery
cr.multiselect(root.get("nombre"), root.get("salario"), cb.count(root.get("proyectos")));

Uso de funciones SQL nativas

Para casos que requieren lógica específica de la base de datos no cubierta por el API de Criteria, se pueden integrar funciones SQL nativas directamente en la consulta.

// Uso de una función SQL nativa para calcular la longitud del nombre
cr.select(cb.function("LENGTH", Integer.class, root.get("nombre")));
Certifícate en Hibernate con CertiDevs PLUS

Ejercicios de esta lección Consultas Criteria avanzadas

Evalúa tus conocimientos de esta lección Consultas Criteria avanzadas con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Consultas JPQL avanzadas

Hibernate
Código

Configuración con JPA

Hibernate
Test

Tipos de datos personalizados

Hibernate
Puzzle

Consultas Criteria avanzadas

Hibernate
Código

Operaciones en cascada

Hibernate
Test

Anotaciones JPA

Hibernate
Puzzle

Asociación Many To One

Hibernate
Test

Funciones en consultas JPQL

Hibernate
Código

Asociación Many To Many entre Actor y Pelicula

Hibernate
Código

Asociación One To Many entre Curso y Estudiante

Hibernate
Código

Tipos de datos básicos

Hibernate
Test

Consultas Criteria básicas

Hibernate
Código

Asociación Many To Many

Hibernate
Puzzle

CRUD de entidades con asociaciones

Hibernate
Proyecto

Optimización de asociaciones con carga lazy

Hibernate
Código

Asociación One To Many

Hibernate
Puzzle

Configuración con Maven

Hibernate
Test

Asociación One To One

Hibernate
Test

CRUD en Hibernate

Hibernate
Código

Operaciones en cascada

Hibernate
Puzzle

Introducción a Hibernate

Hibernate
Test

Atributos de tipo enum en entidades JPA

Hibernate
Código

Carga de asociaciones en consultas con EntityGraph

Hibernate
Código

Configuración con Gradle

Hibernate
Test

Asociación One To One entre Libro y Resumen

Hibernate
Código

Asociación One To Many

Hibernate
Test

Asociación Many To Many

Hibernate
Test

Creación de entidades

Hibernate
Test

Ciclo de vida de una entidad

Hibernate
Código

Consultas JPQL básicas

Hibernate
Código

Carga de asociaciones en consultas con EntityGraph y anotaciones

Hibernate
Código

Tipos de datos embebidos

Hibernate
Código

Asociación Many To One entre Paciente y Clinica

Hibernate
Código

Asociación Many To One

Hibernate
Puzzle

Optimización de consultas con DTOs

Hibernate
Código

Atributos @Transient en entidades

Hibernate
Código

Asociación One To One

Hibernate
Puzzle

Todas las lecciones de Hibernate

Accede a todas las lecciones de Hibernate y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Hibernate

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Gradle

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Maven

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Jpa

Hibernate

Introducción Y Entorno

Creación De Entidades Jpa

Hibernate

Entidades Jpa Y Tipos De Datos

Tipos De Datos En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Atributos @Transient En Entidades

Hibernate

Entidades Jpa Y Tipos De Datos

Enums En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Tipos De Datos Embebidos

Hibernate

Entidades Jpa Y Tipos De Datos

Crud En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Ciclo De Vida De Una Entidad

Hibernate

Entidades Jpa Y Tipos De Datos

Asociación One To One

Hibernate

Asociaciones Entre Entidades

Asociación One To Many

Hibernate

Asociaciones Entre Entidades

Asociación Many To One

Hibernate

Asociaciones Entre Entidades

Asociación Many To Many

Hibernate

Asociaciones Entre Entidades

Operaciones En Cascada

Hibernate

Asociaciones Entre Entidades

Consultas Jpql Básicas

Hibernate

Consultas Hql Y Jpql

Consultas Jpql Avanzadas

Hibernate

Consultas Hql Y Jpql

Funciones En Consultas Jpql

Hibernate

Consultas Hql Y Jpql

Consultas Criteria Básicas

Hibernate

Api Criteria De Jpa

Consultas Criteria Avanzadas

Hibernate

Api Criteria De Jpa

Carga De Asociaciones En Consultas Con Entitygraph

Hibernate

Api Entitygraph

Carga De Asociaciones En Consultas Con Entitygraph Y Anotaciones

Hibernate

Api Entitygraph

Optimización De Consultas Con Dtos

Hibernate

Optimización

Optimización De Asociaciones Con Carga Lazy

Hibernate

Optimización

Certificados de superación de Hibernate

Supera todos los ejercicios de programación del curso de Hibernate y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  1. Entender el uso y configuración de diferentes tipos de joins en el API Criteria de Hibernate.
  2. Aprender a implementar subconsultas dentro de una consulta principal para manejar operaciones más complejas.
  3. Comprender cómo transformar los resultados de las consultas en entidades o DTOs personalizados mediante ResultTransformer.
  4. Conocer las diferencias entre FetchMode y JoinType, y cómo cada uno afecta la carga de asociaciones.
  5. Explorar la utilización de FetchMode para controlar la estrategia de carga de datos.
  6. Aprender a realizar consultas de proyección complejas que involucren la selección de múltiples campos o funciones de agregación.
  7. Integrar funciones SQL nativas en las consultas para manejar requisitos específicos de la base de datos.