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
Del usuario seleccione * de user_data
del usuario donde id = 3 seleccione * de user_data donde id = 3
desde Usuario donde nivel en (10,20,30) seleccione * from user_data donde user_level IN (10, 20, 30)
del pedido del usuario por asc creado seleccione * de orden de datos de usuario por asc creado por usuario
del usuario donde nombre como 'prueba' seleccione * from user_data donde nombre_usuario como 'prueba'

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 seleccionar

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.