Hibernate

Hibernate

Tutorial Hibernate: Funciones en consultas JPQL

Hibernate JPQL funciones: uso y ejemplos prácticos. Domina el uso de funciones en JPQL con Hibernate mediante ejemplos prácticos y detallados.

Introducción

Las funciones en JPQL son herramientas potentes que permiten realizar operaciones más complejas directamente en las consultas, tales como manipulaciones de cadenas de texto, operaciones matemáticas y manejo de fechas, entre otros. 

Utilizando JPQL, los desarrolladores pueden escribir consultas que son independientes de la base de datos, proporcionando así una capa de abstracción que facilita la portabilidad y mantenimiento del código. 

En el contexto de Hibernate, las funciones JPQL se integran de manera fluida para realizar consultas sobre entidades gestionadas.

Funciones de cadena

Las funciones de cadena permiten realizar operaciones sobre campos de texto de las entidades. Utilizar estas funciones en la consulta puede reducir la necesidad de manipulaciones adicionales en el código Java, lo que optimiza el rendimiento al procesar grandes volúmenes de datos.

CONCAT

La función CONCAT combina dos o más cadenas. Es útil para formar una sola cadena a partir de varios campos o valores literales.

// Ejemplo de CONCAT
// Concatena el nombre y apellido de un empleado con un espacio en medio

EntityManager em = ...; // Obtener el EntityManager
TypedQuery<String> query = em.createQuery(
    "SELECT CONCAT(e.nombre, ' ', e.apellido) FROM Empleado e", 
    String.class);
List<String> nombresCompletos = query.getResultList();

LENGTH

LENGTH devuelve el número de caracteres en una cadena. Es especialmente útil para validar la longitud de los datos de texto o para ordenar registros por la longitud de un campo específico.

// Ejemplo de LENGTH
// Obtiene la longitud del nombre de cada empleado

TypedQuery<Integer> queryLength = em.createQuery(
    "SELECT LENGTH(e.nombre) FROM Empleado e", 
    Integer.class);
List<Integer> longitudesNombres = queryLength.getResultList();

LOWER y UPPER

LOWER convierte todos los caracteres de una cadena a minúsculas, y UPPER los convierte a mayúsculas. Estas funciones son útiles para realizar comparaciones de texto insensibles a mayúsculas y minúsculas.

// Ejemplo de LOWER y UPPER
// Selecciona empleados cuyo nombre en mayúsculas es 'ALICIA'

TypedQuery<Empleado> queryUpper = em.createQuery(
    "SELECT e FROM Empleado e WHERE UPPER(e.nombre) = 'ALICIA'", 
    Empleado.class);
List<Empleado> empleadosNombreAlicia = queryUpper.getResultList();

SUBSTRING

SUBSTRING extrae una subcadena de una cadena principal. El segundo argumento es la posición inicial desde donde empezar a extraer la subcadena, notando que el índice de las cadenas comienza en 1. El tercer argumento (opcional) es la longitud de la subcadena a extraer, y si se omite, SUBSTRING extraerá todos los caracteres desde la posición inicial hasta el final de la cadena.

// Ejemplo de SUBSTRING
// Extrae los primeros 5 caracteres del nombre de cada empleado

TypedQuery<String> querySubstring = em.createQuery(
    "SELECT SUBSTRING(e.nombre, 1, 5) FROM Empleado e", 
    String.class);
List<String> primerosCincoCaracteres = querySubstring.getResultList();

Funciones de Agregación

Las funciones de agregación permiten obtener información resumida como conteos, sumas, promedios, valores máximos y mínimos, que son críticos para el análisis de datos y la toma de decisiones dentro de las aplicaciones. Utilizar funciones de agregación directamente en la consulta puede mejorar el rendimiento al procesar grandes cantidades de datos y evitar la sobrecarga de recuperar y manipular estos datos en el lado del cliente.

COUNT

COUNT es una función que cuenta el número de elementos en un grupo o en total, lo que es útil para determinar la cantidad de registros que cumplen ciertos criterios.

// Ejemplo de COUNT
// Cuenta el número total de empleados en la empresa

EntityManager em = ...; // Obtener el EntityManager
TypedQuery<Long> queryCount = em.createQuery(
    "SELECT COUNT(e) FROM Empleado e", 
    Long.class);
Long numeroEmpleados = queryCount.getSingleResult();

SUM

SUM calcula la suma total de un conjunto de valores numéricos. Es ideal para calcular totales en campos numéricos, como el total de ventas, salarios, etc.

// Ejemplo de SUM
// Calcula el total de salarios pagados a los empleados

TypedQuery<Double> querySum = em.createQuery(
    "SELECT SUM(e.salario) FROM Empleado e", 
    Double.class);
Double totalSalarios = querySum.getSingleResult();

AVG

AVG calcula el promedio de un conjunto de valores numéricos. Esta función es muy útil para análisis estadísticos, como encontrar el salario promedio, el costo promedio de los productos, etc.

// Ejemplo de AVG
// Calcula el salario promedio de los empleados

TypedQuery<Double> queryAvg = em.createQuery(
    "SELECT AVG(e.salario) FROM Empleado e", 
    Double.class);
Double salarioPromedio = queryAvg.getSingleResult();

MAX y MIN

MAX y MIN encuentran el valor máximo y mínimo de un conjunto de valores, respectivamente. Estas funciones son cruciales para determinar extremos en los datos, como los salarios más altos y más bajos, las fechas más recientes y más antiguas de transacciones, etc.

// Ejemplo de MAX
// Encuentra el salario más alto entre los empleados

TypedQuery<Double> queryMax = em.createQuery(
    "SELECT MAX(e.salario) FROM Empleado e", 
    Double.class);
Double salarioMaximo = queryMax.getSingleResult();

// Ejemplo de MIN
// Encuentra el salario más bajo entre los empleados

TypedQuery<Double> queryMin = em.createQuery(
    "SELECT MIN(e.salario) FROM Empleado e", 
    Double.class);
Double salarioMinimo = queryMin.getSingleResult();

Otras funciones de agregación

  • GROUP BY: Agrupa resultados que tienen el mismo valor en columnas especificadas, utilizada comúnmente con otras funciones de agregación.
  • HAVING: Se emplea para especificar condiciones de filtrado sobre grupos creados por GROUP BY, permitiendo filtrar grupos según condiciones específicas.
  • DISTINCT: Usada para eliminar duplicados en los resultados de una consulta, frecuentemente usada con COUNT para contar valores únicos.
  • COALESCE: Devuelve el primer valor no nulo en la lista de parámetros, útil para manejar valores nulos en cálculos de agregación.
  • NULLIF: Devuelve null si los dos argumentos son iguales, de lo contrario devuelve el primer argumento, utilizado para evitar divisiones por cero.

Funciones matemáticas

Las funciones matemáticas en JPQL facilitan la ejecución de operaciones aritméticas directamente en las consultas a la base de datos. Esto es particularmente útil para realizar cálculos que de otra manera requerirían manipulaciones adicionales en el código Java, optimizando así el rendimiento al procesar y analizar grandes volúmenes de datos numéricos.

ABS

La función ABS calcula el valor absoluto de un número, lo cual es útil para garantizar que se manejan valores no negativos en los cálculos o comparaciones.

// Ejemplo de ABS
// Calcula el valor absoluto del saldo de cuentas, para aquellas que tengan un saldo negativo

EntityManager em = ...; // Obtener el EntityManager
TypedQuery<Double> queryAbs = em.createQuery(
    "SELECT ABS(c.saldo) FROM Cuenta c WHERE c.saldo < 0", 
    Double.class);
List<Double> saldosAbsolutos = queryAbs.getResultList();

Otras funciones matemáticas

  • MOD(a, b): Devuelve el resto de la división de a por b. Útil para determinar la paridad de un número o para aplicar operaciones que dependen de un ciclo periódico, como asignaciones de tareas por días de la semana.
  • CEIL(x) o CEILING(x): Redondea x al entero más pequeño no menor que x (redondea al alza).
  • FLOOR(x): Redondea x al entero más grande no mayor que x (redondea a la baja).
  • ROUND(x): Redondea x al entero más cercano.
  • POWER(a, b): Eleva a a la potencia de b.
  • SQRT(x): Calcula la raíz cuadrada de x.
  • RANDOM(): Genera un número aleatorio entre 0 y 1.

Funciones de fecha

Las funciones de fecha permiten manipular y consultar campos de datos basados en fechas y tiempos directamente desde la base de datos.

CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP

CURRENT_DATE, CURRENT_TIME, y CURRENT_TIMESTAMP son funciones que retornan la fecha, la hora, y la fecha y hora actuales del sistema, respectivamente. Son útiles para registrar eventos en tiempo real o para realizar comparaciones con fechas y horas actuales.

// Ejemplo de CURRENT_DATE
// Selecciona todos los pedidos que se han realizado hoy

EntityManager em = ...; // Obtener el EntityManager
TypedQuery<Pedido> queryCurrentDate = em.createQuery(
    "SELECT p FROM Pedido p WHERE p.fechaPedido = CURRENT_DATE", 
    Pedido.class);
List<Pedido> pedidosDeHoy = queryCurrentDate.getResultList();

EXTRACT

EXTRACT se usa para descomponer una fecha en sus componentes como año, mes, día, hora, minutos, etc. Esto es particularmente útil para agrupar o filtrar datos basados en un componente específico de la fecha.

// Ejemplo de EXTRACT
// Cuenta cuántos empleados se han unido en cada año

TypedQuery<Object[]> queryExtract = em.createQuery(
    "SELECT EXTRACT(YEAR FROM e.fechaIngreso) as Year, COUNT(e) FROM Empleado e GROUP BY EXTRACT(YEAR FROM e.fechaIngreso)",
    Object[].class);
List<Object[]> empleadosPorAño = queryExtract.getResultList();

DATE_DIFF

DATE_DIFF calcula la diferencia en días entre dos fechas. Es esencial para cálculos que requieren entender la duración entre eventos, como calcular la antigüedad de los empleados o el tiempo hasta que un producto debe ser entregado.

// Ejemplo de DATE_DIFF
// Calcula la cantidad de días que faltan para la entrega de cada pedido

TypedQuery<Long> queryDateDiff = em.createQuery(
    "SELECT DATE_DIFF(p.fechaEntrega, CURRENT_DATE) FROM Pedido p WHERE p.estado = 'Pendiente'", 
    Long.class);
List<Long> diasParaEntrega = queryDateDiff.getResultList();

ADD y SUBTRACT

ADD y SUBTRACT son funciones que permiten añadir o sustraer una cantidad específica de unidades de tiempo a las fechas, como días, meses, o años.

// Ejemplo de ADD
// Añade 5 días a la fecha actual para calcular una nueva fecha de entrega

TypedQuery<Date> queryAdd = em.createQuery(
    "SELECT ADD(CURRENT_DATE, 5) FROM Pedido p", 
    Date.class);
List<Date> nuevasFechasEntrega = queryAdd.getResultList();

// Ejemplo de SUBTRACT
// Sustrae 30 días de la fecha de contratación para calcular períodos de prueba

TypedQuery<Date> querySubtract = em.createQuery(
    "SELECT SUBTRACT(e.fechaContratacion, 30) FROM Empleado e", 
    Date.class);
List<Date> inicioPeriodoPrueba = querySubtract.getResultList();
Certifícate en Hibernate con CertiDevs PLUS

Ejercicios de esta lección Funciones en consultas JPQL

Evalúa tus conocimientos de esta lección Funciones en consultas JPQL 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. Comprender el uso y aplicación de funciones de cadena en JPQL para optimizar la manipulación de textos en la base de datos.
  2. Aprender acerca de las funciones de agregación y su importancia en el análisis de grandes volúmenes de datos.
  3. Entender cómo JPQL facilita cálculos matemáticos complejos dentro de las consultas a la base de datos.
  4. Reconocer la utilidad de las funciones de fecha en JPQL para manipular y consultar campos basados en fechas y tiempos.