Hibernate: Consultas HQL y JPQL

Aprende a realizar consultas HQL y JPQL en Hibernate con ejemplos actualizados y prácticas recomendadas para 2024.

HQL y JPQL son lenguajes de consulta diseñados para trabajar con entidades persistentes en Hibernate y JPA (Java Persistence API), respectivamente. Ambos lenguajes son similares en sintaxis y funcionalidad, permitiendo realizar consultas a nivel de objetos en lugar de tablas de bases de datos.

Sintaxis básica de HQL

HQL es similar a SQL pero trabaja con objetos en lugar de tablas. Aquí un ejemplo de una consulta básica en HQL:

String hql = "FROM Usuario WHERE nombre = :nombre";
Query query = session.createQuery(hql);
query.setParameter("nombre", "Juan");
List<Usuario> resultados = query.list();

En este ejemplo, la consulta FROM Usuario WHERE nombre = :nombre obtiene todos los objetos Usuario cuyo nombre es "Juan". La consulta utiliza :nombre como un parámetro nombrado para evitar inyecciones SQL.

Sintaxis básica de JPQL

JPQL es parte de la especificación JPA y comparte muchas similitudes con HQL. Un ejemplo de una consulta básica en JPQL es:

String jpql = "SELECT u FROM Usuario u WHERE u.nombre = :nombre";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
query.setParameter("nombre", "Juan");
List<Usuario> resultados = query.getResultList();

Aquí, SELECT u FROM Usuario u WHERE u.nombre = :nombre es una consulta JPQL que selecciona todos los objetos Usuario cuyo nombre es "Juan".

Consultas avanzadas con HQL y JPQL

Uso de funciones agregadas

HQL y JPQL permiten el uso de funciones agregadas como COUNT, SUM, AVG, MAX y MIN. Por ejemplo, para contar el número de usuarios:

En HQL:

String hql = "SELECT COUNT(*) FROM Usuario";
Query query = session.createQuery(hql);
Long count = (Long) query.uniqueResult();

En JPQL:

String jpql = "SELECT COUNT(u) FROM Usuario u";
TypedQuery<Long> query = entityManager.createQuery(jpql, Long.class);
Long count = query.getSingleResult();

Consultas con JOIN

Las consultas con JOIN son esenciales para trabajar con relaciones entre entidades. Un ejemplo de cómo realizar un JOIN en HQL y JPQL es el siguiente:

En HQL:

String hql = "FROM Pedido p JOIN p.cliente c WHERE c.nombre = :nombre";
Query query = session.createQuery(hql);
query.setParameter("nombre", "Juan");
List<Pedido> pedidos = query.list();

En JPQL:

String jpql = "SELECT p FROM Pedido p JOIN p.cliente c WHERE c.nombre = :nombre";
TypedQuery<Pedido> query = entityManager.createQuery(jpql, Pedido.class);
query.setParameter("nombre", "Juan");
List<Pedido> pedidos = query.getResultList();

Parámetros y paginación

Parámetros nombrados y posicionados

El uso de parámetros nombrados y posicionados es crucial para evitar inyecciones SQL y mejorar la claridad del código.

Parámetros nombrados en HQL:

String hql = "FROM Usuario WHERE nombre = :nombre";
Query query = session.createQuery(hql);
query.setParameter("nombre", "Juan");
List<Usuario> resultados = query.list();

Parámetros posicionados en JPQL:

String jpql = "SELECT u FROM Usuario u WHERE u.nombre = ?1";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
query.setParameter(1, "Juan");
List<Usuario> resultados = query.getResultList();

Paginación en consultas

La paginación es útil cuando se trabaja con grandes conjuntos de datos. Hibernate soporta paginación mediante los métodos setFirstResult y setMaxResults.

En HQL:

String hql = "FROM Usuario";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(10);
List<Usuario> usuarios = query.list();

En JPQL:

String jpql = "SELECT u FROM Usuario u";
TypedQuery<Usuario> query = entityManager.createQuery(jpql, Usuario.class);
query.setFirstResult(0);
query.setMaxResults(10);
List<Usuario> usuarios = query.getResultList();

Con estas técnicas y ejemplos prácticos, podrás realizar consultas eficientes y seguras en Hibernate utilizando HQL y JPQL.

Certifícate en Hibernate con CertiDevs PLUS

Lecciones de este módulo de Hibernate

Lecciones de programación del módulo Consultas HQL y JPQL del curso de Hibernate.

Ejercicios de programación en este módulo de Hibernate

Evalúa tus conocimientos en Consultas HQL y JPQL con ejercicios de programación Consultas HQL y JPQL de tipo Test, Puzzle, Código y Proyecto con VSCode.