Hibernate: Consultas HQL y JPQL
Aprende a realizar consultas HQL y JPQL en Hibernate con ejemplos actualizados y prácticas recomendadas para 2024.
Aprende Hibernate GRATIS y certifícateHQL 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.
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.