Hibernate

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.

Introducció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 alias e en el contexto de esta consulta. FROM Empleado e especifica la clase de entidad Empleado desde la cual se seleccionarán las instancias, nuevamente utilizando e como un alias para referenciar a cualquier instancia de Empleado 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 de Empleado.

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 JOINs.

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 mediante createQuery(). La consulta "SELECT e FROM Empleado e WHERE e.salario > :salarioMinimo" especifica que queremos seleccionar entidades Empleado (e) cuyo atributo salario 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 valor 30000 al parámetro salarioMinimo en la consulta.
  • Recuperación de resultados: query.getResultList() ejecuta la consulta filtrada y recopila los resultados en una lista de entidades Empleado.

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 entidades Empleado (e), ordenadas por el atributo nombre 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 atributo nombre de la entidad Empleado, y ASC indica que el ordenamiento debe ser ascendente. Si se deseara un ordenamiento descendente, se utilizaría DESC en lugar de ASC.
  • 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 atributos nombre y salario de las entidades Empleado que cumplan con la condición especificada en la cláusula WHERE.
  • 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 de Object.
Certifícate en Hibernate con CertiDevs PLUS

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

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 la función y estructura básica de JPQL dentro del ecosistema Hibernate para la manipulación de entidades Java.
  2. Aprender a crear consultas básicas para recuperar entidades completas o específicas de una base de datos usando JPQL.
  3. 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.
  4. Aprender a ordenar los resultados de una consulta JPQL mediante la cláusula ORDER BY, especificando secuencias ascendentes o descendentes.
  5. 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.