Hibernate
Tutorial Hibernate: Consultas Criteria avanzadas
Hibernate Criteria avanzado: consultas complejas. Aprende a realizar consultas complejas en Hibernate utilizando Criteria avanzado con ejemplos detallados.
Aprende Hibernate GRATIS y certifícateIntroducció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” conFetchMode.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
oJoinType.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")));
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
Configuración con JPA
Tipos de datos personalizados
Consultas Criteria avanzadas
Operaciones en cascada
Anotaciones JPA
Asociación Many To One
Funciones en consultas JPQL
Asociación Many To Many entre Actor y Pelicula
Asociación One To Many entre Curso y Estudiante
Tipos de datos básicos
Consultas Criteria básicas
Asociación Many To Many
CRUD de entidades con asociaciones
Optimización de asociaciones con carga lazy
Asociación One To Many
Configuración con Maven
Asociación One To One
CRUD en Hibernate
Operaciones en cascada
Introducción a Hibernate
Atributos de tipo enum en entidades JPA
Carga de asociaciones en consultas con EntityGraph
Configuración con Gradle
Asociación One To One entre Libro y Resumen
Asociación One To Many
Asociación Many To Many
Creación de entidades
Ciclo de vida de una entidad
Consultas JPQL básicas
Carga de asociaciones en consultas con EntityGraph y anotaciones
Tipos de datos embebidos
Asociación Many To One entre Paciente y Clinica
Asociación Many To One
Optimización de consultas con DTOs
Atributos @Transient en entidades
Asociación One To One
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
Introducción Y Entorno
Configuración Hibernate Con Gradle
Introducción Y Entorno
Configuración Hibernate Con Maven
Introducción Y Entorno
Configuración Hibernate Con Jpa
Introducción Y Entorno
Tipos De Datos En Hibernate
Entidades Jpa Y Tipos De Datos
Atributos @Transient En Entidades
Entidades Jpa Y Tipos De Datos
Enums En Hibernate
Entidades Jpa Y Tipos De Datos
Tipos De Datos Embebidos
Entidades Jpa Y Tipos De Datos
Crud En Hibernate
Entidades Jpa Y Tipos De Datos
Ciclo De Vida De Una Entidad
Entidades Jpa Y Tipos De Datos
Creación De Entidades Jpa
Entidades Jpa Y Tipos De Datos
Asociación One To One
Asociaciones Entre Entidades
Asociación One To Many
Asociaciones Entre Entidades
Asociación Many To One
Asociaciones Entre Entidades
Asociación Many To Many
Asociaciones Entre Entidades
Operaciones En Cascada
Asociaciones Entre Entidades
Consultas Jpql Básicas
Consultas Hql Y Jpql
Consultas Jpql Avanzadas
Consultas Hql Y Jpql
Funciones En Consultas Jpql
Consultas Hql Y Jpql
Consultas Criteria Básicas
Api Criteria De Jpa
Consultas Criteria Avanzadas
Api Criteria De Jpa
Carga De Asociaciones En Consultas Con Entitygraph
Api Entitygraph
Carga De Asociaciones En Consultas Con Entitygraph Y Anotaciones
Api Entitygraph
Optimización De Consultas Con Dtos
Optimización
Optimización De Asociaciones Con Carga Lazy
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
- Entender el uso y configuración de diferentes tipos de joins en el API Criteria de Hibernate.
- Aprender a implementar subconsultas dentro de una consulta principal para manejar operaciones más complejas.
- Comprender cómo transformar los resultados de las consultas en entidades o DTOs personalizados mediante
ResultTransformer
. - Conocer las diferencias entre
FetchMode
yJoinType
, y cómo cada uno afecta la carga de asociaciones. - Explorar la utilización de
FetchMode
para controlar la estrategia de carga de datos. - Aprender a realizar consultas de proyección complejas que involucren la selección de múltiples campos o funciones de agregación.
- Integrar funciones SQL nativas en las consultas para manejar requisitos específicos de la base de datos.