Hibernate
Tutorial Hibernate: Consultas JPQL básicas
Hibernate JPQL consultas básicas: guía práctica. Aprende a realizar consultas básicas en JPQL con Hibernate mediante ejemplos prácticos.
Aprende Hibernate GRATIS y certifícateIntroducción
La Jakarta Persistence Query Language (JPQL) es un componente clave de Hibernate, que proporciona una manera de realizar consultas sobre entidades gestionadas por el contexto de persistencia de Hibernate, de forma similar a cómo se realiza en SQL pero operando directamente sobre entidades Java en lugar de tablas de bases de datos.
JPQL permite seleccionar, filtrar y manipular datos de una forma que es independiente de la base de datos subyacente. Las consultas JPQL se escriben en términos de clases y propiedades de Java en lugar de tablas y columnas de bases de datos.
Consulta básica
En el ámbito de Hibernate y JPQL, una consulta básica es aquella que permite recuperar entidades completas o parte de ellas de la base de datos. Estas consultas sirven como punto de partida para operaciones más complejas. El comando SELECT
de JPQL permite seleccionar entidades específicas basadas en criterios definidos o simplemente recuperar todas las instancias de una clase. La sintaxis básica involucra especificar qué se desea seleccionar (en este caso, entidades completas) y de dónde (la clase de entidad en cuestión).
Consideremos un escenario en el que deseamos seleccionar todos los registros de empleados en una aplicación de gestión empresarial. La clase Empleado
representa la entidad en nuestro modelo de datos. La consulta JPQL para realizar esta operación sería:
// Crear una instancia de Query usando el método createQuery() del EntityManager
jakarta.persistence.Query query = entityManager.createQuery("SELECT e FROM Empleado e");
// Ejecutar la consulta y recuperar la lista de resultados
List<Empleado> resultado = query.getResultList();
- EntityManager: Este es el punto de partida para la interacción con la persistencia en una aplicación JPA. Provee métodos para crear y ejecutar consultas, además de gestionar el ciclo de vida de las entidades. En este caso,
entityManager
se utiliza para crear una nueva consulta JPQL. - Consulta JPQL:
"SELECT e FROM Empleado e"
es la consulta JPQL propiamente dicha. Aquí,SELECT e
indica que deseamos seleccionar entidades completas, representadas temporalmente por el aliase
en el contexto de esta consulta.FROM Empleado e
especifica la clase de entidadEmpleado
desde la cual se seleccionarán las instancias, nuevamente utilizandoe
como un alias para referenciar a cualquier instancia deEmpleado
dentro de la consulta. - Ejecución de la consulta y recuperación de resultados:
query.getResultList()
ejecuta la consulta y recopila los resultados en una lista deEmpleado
.
Los alias como e
en esta consulta cumplen múltiples propósitos. Primero, permiten referencias concisas a entidades en otras partes de la consulta, como condiciones de filtrado, ordenamiento, etc. Segundo, mejoran la legibilidad de la consulta, especialmente cuando se realizan operaciones más complejas como JOIN
s.
Filtrado de resultados
El filtrado de resultados permite obtener un conjunto de datos específico basado en criterios definidos. JPQL permite filtrar datos mediante el uso de la cláusula WHERE
.
Consideremos un caso práctico en el que necesitamos seleccionar empleados de una base de datos cuyos salarios superen un valor mínimo determinado:
// Preparación de la consulta JPQL con un parámetro de filtro
jakarta.persistence.Query query = entityManager.createQuery("SELECT e FROM Empleado e WHERE e.salario > :salarioMinimo");
// Establecimiento del parámetro de la consulta
query.setParameter("salarioMinimo", 30000);
// Ejecución de la consulta y recuperación de los resultados
List<Empleado> resultado = query.getResultList();
- Creación de la consulta: Usamos
EntityManager
para crear una nueva consulta JPQL mediantecreateQuery()
. La consulta"SELECT e FROM Empleado e WHERE e.salario > :salarioMinimo"
especifica que queremos seleccionar entidadesEmpleado
(e
) cuyo atributosalario
exceda un valor mínimo (:salarioMinimo
). - Uso de parámetros: La consulta utiliza un parámetro nombrado
:salarioMinimo
para representar el umbral salarial en el filtrado. El uso de parámetros no solo incrementa la seguridad evitando la inyección de SQL, sino que también hace el código más flexible y reutilizable. - Establecimiento del parámetro:
query.setParameter("salarioMinimo", 30000)
asigna el valor30000
al parámetrosalarioMinimo
en la consulta. - Recuperación de resultados:
query.getResultList()
ejecuta la consulta filtrada y recopila los resultados en una lista de entidadesEmpleado
.
Ordenar resultados
En JPQL, el ordenamiento de resultados se logra mediante la cláusula ORDER BY
. Esta cláusula es especialmente útil cuando se necesita presentar los datos en secuencias específicas, ya sea ascendente (ASC
) o descendente (DESC
), basado en uno o varios atributos de las entidades.
Consideremos que necesitamos obtener una lista de empleados de una empresa, ordenada alfabéticamente por sus nombres:
// Preparación de la consulta JPQL con ordenamiento
jakarta.persistence.Query query = entityManager.createQuery("SELECT e FROM Empleado e ORDER BY e.nombre ASC");
// Ejecución de la consulta y recuperación de los resultados ordenados
List<Empleado> resultado = query.getResultList();
- Creación de la consulta con ordenamiento: La consulta JPQL
"SELECT e FROM Empleado e ORDER BY e.nombre ASC"
indica que deseamos seleccionar todas las entidadesEmpleado
(e
), ordenadas por el atributonombre
de manera ascendente. - Especificación del orden: La cláusula
ORDER BY e.nombre ASC
especifica el criterio de ordenamiento. En este caso,e.nombre
refiere al atributonombre
de la entidadEmpleado
, yASC
indica que el ordenamiento debe ser ascendente. Si se deseara un ordenamiento descendente, se utilizaríaDESC
en lugar deASC
. - Recuperación y ordenamiento de resultados:
query.getResultList()
ejecuta la consulta, y el sistema de gestión de bases de datos ordena los registros de acuerdo con el criterio especificado antes de retornarlos.
Consulta de campos específicos
La consulta de campos específicos en JPQL permite seleccionar y recuperar únicamente los atributos necesarios de las entidades, en lugar de cargar la entidad completa. Esta capacidad de seleccionar campos individuales directamente en la consulta ayuda a optimizar el uso de la memoria y puede mejorar la velocidad de ejecución de las aplicaciones.
Imaginemos un escenario donde necesitamos generar un reporte de los empleados que ganan más de un salario mínimo específico, pero solo estamos interesados en sus nombres y salarios, y no en la totalidad de la información de la entidad Empleado
. A continuación se muestra cómo se puede realizar esta operación usando JPQL:
// Preparar una consulta JPQL para seleccionar campos específicos
jakarta.persistence.Query query = entityManager.createQuery("SELECT e.nombre, e.salario FROM Empleado e WHERE e.salario > :salarioMinimo");
// Establecer el parámetro de la consulta para el filtrado por salario
query.setParameter("salarioMinimo", 30000);
// Ejecutar la consulta y recuperar los resultados
List<Object[]> resultado = query.getResultList();
// Iterar sobre los resultados para acceder a los campos seleccionados
for (Object[] empleado : resultado) {
System.out.println("Nombre: " + empleado[0] + ", Salario: " + empleado[1]);
}
- Creación de la consulta: La consulta
"SELECT e.nombre, e.salario FROM Empleado e WHERE e.salario > :salarioMinimo"
indica que deseamos seleccionar solo los atributosnombre
ysalario
de las entidadesEmpleado
que cumplan con la condición especificada en la cláusulaWHERE
. - Ejecución de la consulta y recuperación de resultados:
query.getResultList()
ejecuta la consulta, devolviendo una lista de arrays de objetos (Object[]
), donde cada array representa un conjunto de campos (en este caso, nombre y salario) de un empleado que cumple con la condición especificada. - Acceso a los campos seleccionados: Iteramos sobre la lista de resultados, accediendo a cada campo por su índice dentro del array. Este paso es necesario porque, al seleccionar campos específicos en lugar de entidades completas, los resultados no se devuelven como objetos de tipo
Empleado
, sino como arrays deObject
.
Ejercicios de esta lección Consultas JPQL básicas
Evalúa tus conocimientos de esta lección Consultas JPQL básicas 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 la función y estructura básica de JPQL dentro del ecosistema Hibernate para la manipulación de entidades Java.
- Aprender a crear consultas básicas para recuperar entidades completas o específicas de una base de datos usando JPQL.
- Comprender cómo filtrar resultados en JPQL mediante el uso de la cláusula
WHERE
y parámetros dinámicos para obtener conjuntos de datos precisos. - Aprender a ordenar los resultados de una consulta JPQL mediante la cláusula
ORDER BY
, especificando secuencias ascendentes o descendentes. - Familiarizarse con la selección de campos específicos en JPQL para optimizar la carga de datos y mejorar la eficiencia de la aplicación.