2.1 Introducción a las clases Query

Por cierto, otro punto importante es la clase auxiliar Query. Podrías verlo en este ejemplo:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

De hecho, Query es una interfaz y tiene varias implementaciones para diferentes casos. Pero por simplicidad, continuaré llamándolo una clase. Esta es, digamos, una clase en un sentido amplio, en términos de programación orientada a objetos.

Nota. Solía ​​haber dos clases:

  • Consulta para describir la consulta.
  • TypedQuery para describir una consulta con un tipo conocido.

El primero apareció cuando ya existía Hibernate, y aún no había genéricos. Luego, después del lanzamiento de JDK 5, se agregó otra clase a Hibernate: TypedQuery, que ya admitía la escritura del resultado de la consulta.

Pero, por lo que recuerdo, a partir de la quinta versión de Hibernate, solo quedaba una clase escrita, y ahora se llama Query.

La forma estándar de crear una consulta es:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

Aprendió a crear objetos Query, pero ¿cómo ejecuta estas consultas?

Aquí es aún más simple: simplemente llamamos al método list() en el objeto Query:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

El método list() tiene un sinónimo de JPA, un método que hace lo mismo pero se llama getResultList() . A veces puede verlo en el código escrito por otros programadores.

Por cierto, si la consulta implica que el resultado será un solo resultado, entonces es más fácil usar el método uniqueResult() para llamar a la consulta .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

El método uniqueResult() tiene un sinónimo de JPA, el método singleResult() . Se introdujo para la compatibilidad de Hibernate con el estándar JPA. Hace exactamente lo mismo.

2.2 Métodos de clase de consulta

De hecho, la clase Query tiene muchos métodos diferentes. A continuación hablaré de tres más de ellos.

El primero es el método stream() . Y su sinónimo JPA getResultStream() .

Ambos métodos devuelven un flujo de datos en lugar de una lista. Este enfoque puede ser muy eficaz cuando no necesita todos los objetos obtenidos como resultado de una consulta a la vez. O existe la posibilidad de que solo se utilice el primero de ellos.

Ejemplo:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

El segundo método es el método executeUpdate() . Puede escribir una consulta que cambiará algo en la base de datos. En este caso, es necesario que Hibernate no utilice una transacción de solo lectura al acceder a la base de datos.

Ejemplo de solicitud: decidimos subir el nivel de todos los usuarios en 1.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

El método executeUpdate() devolverá el número de filas que realmente se han modificado.

Y finalmente el tercer método es scroll() . Te contamos un poco más al respecto.

2.3 Métodos de clase de desplazamiento

Este método es algo similar al método stream() . Solo le permite moverse a través de la lista de resultados sin sacar los resultados en absoluto. Es decir, puede ejecutar una consulta, luego desplazarla hasta la millonésima línea del resultado y comenzar a leer datos desde allí.

Un iterador tan avanzado.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

El objeto ScrollableResults tiene los siguientes métodos:

Método Descripción
obtener R () Devuelve el elemento actual
próximo() Mueve el puntero al siguiente elemento
anterior() Mueve el puntero al elemento anterior
desplazamiento (tamaño int) Desplácese hacia adelante por líneas de tamaño
posición (posición int) Hace que el número pos del elemento sea el elemento actual
último() El elemento actual es ahora el último
primero() El elemento actual es ahora el primero.
obtenerNúmeroFila() Devuelve el número de línea actual
establecerNúmeroFila() Establece el número de línea actual

Digamos que ejecutó una consulta y desea obtener el último elemento. Aquí está cómo hacerlo:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();