Hibernate: lenguaje de consulta

Hibernate Query Language (HQL) es un lenguaje de consulta orientado a objetos, similar a SQL, pero en lugar de operar en tablas y columnas, HQL trabaja con objetos persistentes y sus propiedades. Las consultas HQL son traducidas por Hibernate en consultas SQL convencionales, que a su vez realizan acciones en la base de datos.

Aunque puede usar declaraciones SQL directamente con Hibernate usando SQL nativo, recomendaría usar HQL siempre que sea posible para evitar problemas de portabilidad de bases de datos y aprovechar las estrategias de generación de SQL y almacenamiento en caché de Hibernate.

Las palabras clave como SELECT, FROM y WHERE, etc., no distinguen entre mayúsculas y minúsculas, pero las propiedades como los nombres de tablas y columnas sí distinguen entre mayúsculas y minúsculas en HQL.

DE Cláusula

Usarás FROMcláusula si desea cargar objetos persistentes completos en la memoria. A continuación se muestra la sintaxis simple de usar la cláusula FROM:

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();

Si necesita calificar completamente un nombre de clase en HQL, simplemente especifique el paquete y el nombre de clase de la siguiente manera:

String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();

AS Cláusula

los ASLa cláusula se puede usar para asignar alias a las clases en sus consultas HQL, especialmente cuando tiene consultas largas. Por ejemplo, nuestro ejemplo simple anterior sería el siguiente:

String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();

los AS La palabra clave es opcional y también puede especificar el alias directamente después del nombre de la clase, de la siguiente manera:

String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

SELECT Cláusula

los SELECTLa cláusula proporciona más control sobre el conjunto de resultados que la cláusula from. Si desea obtener pocas propiedades de los objetos en lugar del objeto completo, use la cláusula SELECT. A continuación se muestra la sintaxis simple de usar la cláusula SELECT para obtener solo el campo first_name del objeto Employee:

String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

Es notable aquí que Employee.firstName es una propiedad del objeto Employee en lugar de un campo de la tabla EMPLOYEE.

Dónde cláusula

Si desea limitar los objetos específicos que se devuelven del almacenamiento, use la cláusula WHERE. A continuación se muestra la sintaxis simple de usar la cláusula WHERE:

String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();

Cláusula ORDER BY

Para ordenar los resultados de su consulta HQL, deberá utilizar el ORDER BYcláusula. Puede ordenar los resultados por cualquier propiedad en los objetos del conjunto de resultados, ya sea ascendente (ASC) o descendente (DESC). A continuación se muestra la sintaxis simple de usar la cláusula ORDER BY:

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();

Si desea ordenar por más de una propiedad, simplemente agregue las propiedades adicionales al final de la cláusula order by, separadas por comas de la siguiente manera:

String hql = "FROM Employee E WHERE E.id > 10 " +
             "ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();

Cláusula GROUP BY

Esta cláusula permite a Hibernate extraer información de la base de datos y agruparla según el valor de un atributo y, por lo general, usar el resultado para incluir un valor agregado. A continuación se muestra la sintaxis simple de usar la cláusula GROUP BY:

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
             "GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();

Usar parámetros con nombre

Hibernate admite parámetros con nombre en sus consultas HQL. Esto facilita la redacción de consultas HQL que aceptan entradas del usuario y no tiene que defenderse de los ataques de inyección SQL. A continuación se muestra la sintaxis simple de usar parámetros con nombre:

String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();

ACTUALIZAR Cláusula

Las actualizaciones masivas son nuevas para HQL con Hibernate 3, y eliminan el trabajo de manera diferente en Hibernate 3 que en Hibernate 2. La interfaz de consulta ahora contiene un método llamado executeUpdate () para ejecutar declaraciones HQL UPDATE o DELETE.

los UPDATELa cláusula se puede utilizar para actualizar una o más propiedades de uno o más objetos. A continuación se muestra la sintaxis simple del uso de la cláusula UPDATE:

String hql = "UPDATE Employee set salary = :salary "  + 
             "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

BORRAR Cláusula

los DELETELa cláusula se puede utilizar para eliminar uno o más objetos. A continuación se muestra la sintaxis simple de usar la cláusula DELETE:

String hql = "DELETE FROM Employee "  + 
             "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

INSERTAR Cláusula

Soportes HQL INSERT INTOcláusula solo donde los registros se pueden insertar de un objeto a otro objeto. A continuación se muestra la sintaxis simple de usar la cláusula INSERT INTO:

String hql = "INSERT INTO Employee(firstName, lastName, salary)"  + 
             "SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

Métodos agregados

HQL admite una variedad de métodos agregados, similares a SQL. Funcionan de la misma manera en HQL que en SQL y la siguiente es la lista de funciones disponibles:

No Señor. Funciones y descripción
1

avg(property name)

El promedio del valor de una propiedad

2

count(property name or *)

El número de veces que aparece una propiedad en los resultados.

3

max(property name)

El valor máximo de los valores de la propiedad.

4

min(property name)

El valor mínimo de los valores de la propiedad.

5

sum(property name)

La suma total de los valores de la propiedad

los distinctpalabra clave solo cuenta los valores únicos en el conjunto de filas. La siguiente consulta devolverá solo un recuento único:

String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

Paginación usando Query

Hay dos métodos de la interfaz de consulta para la paginación.

No Señor. Método y descripción
1

Query setFirstResult(int startPosition)

Este método toma un número entero que representa la primera fila en su conjunto de resultados, comenzando con la fila 0.

2

Query setMaxResults(int maxResult)

Este método le dice a Hibernate que recupere un número fijo maxResults de objetos.

Usando los dos métodos anteriores juntos, podemos construir un componente de paginación en nuestra aplicación web o Swing. A continuación se muestra el ejemplo, que puede ampliar para obtener 10 filas a la vez:

String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();