CodeGym /Cursos Java /Módulo 4. Working with databases /Aprendiendo a escribir consultas en HQL

Aprendiendo a escribir consultas en HQL

Módulo 4. Working with databases
Nivel 10 , Lección 0
Disponible

1.1 Introducción a HQL

Anteriormente, conoció a Hibernate, y ahora le presentaré HQL , también conocido como Hibernate Query Language . De hecho, esto es SQL convertido para escribir consultas en Hibernate. Tiene varias diferencias clave.

  1. Usando el nombre de la clase en lugar del nombre de la tabla.
  2. Usar el nombre del campo de la clase en lugar del nombre de la columna de la tabla.
  3. Uso opcional de select.

Pidamos a Hibernate que nos devuelva todos los usuarios que tiene en la base de datos. Así es como se vería esa solicitud:

from User

Eso es todo, a modo de comparación, presentamos una consulta similar en SQL:

select * from user

Aquí Userestá el nombre de la clase, y useres el nombre de la tabla.

El código Java completo se verá así:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

De lo contrario, HQL es muy similar a SQL; también tiene operadores:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Ejemplo de trabajo con HQL

Quizás el ejemplo anterior sea un poco confuso debido a los mismos nombres de tabla y campo. Vamos a pensar en un ejemplo especial en el que esto sería más fácil.

Digamos que tenemos una tabla de datos de usuario que contiene los siguientes campos:

  • identificación INT
  • nombre de usuario VARCHAR(100)
  • usuario_nivel INT
  • usuario_creado FECHA

Crearemos una clase de Java que se asignará a esta tabla:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

Ahora escribamos algunos ejemplos:

HQL SQL
from User select * from user_data
from User where id=3 select * from user_data where id=3
from User where level in (10,20,30) select * from user_data where user_level IN (10, 20, 30)
from User order by created asc select * from user_data order by user_created asc
from User where name like 'test' select * from user_data where user_name like 'test'

Las consultas son muy similares, y leer consultas HQL cuando está familiarizado con los nombres de clase y sus campos es tan fácil como leer consultas SQL. Puede ser un poco más difícil de escribir, pero, de nuevo, las consultas muy complejas rara vez se escriben en HQL.

1.3 Usando select

En HQL, puede usar selectcuando el tipo de datos del resultado no coincide con el tipo especificado en from.

Por ejemplo, queremos obtener los nombres de todos los usuarios que están en nuestra tabla de datos de usuario , luego debemos escribir la siguiente consulta:

select name from User

Además, si hay duplicados entre los nombres, puede usar el operador DISTINCT:

select distinct name from User

Los alias funcionan igual que en SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Bueno, completamente en forma de código Java, esta solicitud se verá así:

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Tenga en cuenta que la consulta debe devolver una lista de nombres. Los nombres son de tipo String, por lo que tanto el tipo de función como el parámetro de tipo de la clase Query son de tipo String.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION