====== Query ======
Hasta ahora nos hemos dedicado a ver las diversas formas de persistencia que soporta hibernate en función de nuestro modelo de objetos de negocio en Java. Pero una característica fundamental de cualquier ORM es la necesidad de leer dichos objetos de la base de datos.
Hibernate tiene el objeto org.hibernate.Query|Query que nos da acceso a todas las funcionalidades para poder leer objetos desde la base de datos. Veamos ahora un sencillo ejemplo de cómo funciona y posteriormente explicaremos más funcionalidades de la clase org.hibernate.Query|Query.
Query query = session.createQuery("SELECT p FROM Profesor p");
List profesores = query.list();
for (Profesor profesor : profesores) {
System.out.println(profesor.toString());
}
Lanzar una consulta con Hibernate es bastante simple. Usando la org.hibernate.Session|session llamamos al método org.hibernate.SharedSessionContract#createQuery(java.lang.String)|createQuery(String queryString) con la consulta en formato [[02_hql]] y nos retorna un objeto org.hibernate.Query|Query (Línea 1). Después, sobre el objeto org.hibernate.Query|Query llamamos al método org.hibernate.Query#list()|list() que nos retorna una lista de los objetos que ha retornado (Línea 2).
Por último en las líneas de la 4 a la 6 podemos ver cómo usar la lista de objetos ''Profesor'' aunque este código ya es simplemente el uso de la clase java.util.List que no tiene nada que ver con Hibernate.
En la siguiente lección se explica en detalle se explica en detalle el lenguaje de consultas que usa Hibernate, ya que no se usa SQL sino [[02_hql|Hibernate Query Languaje (HQL)]]
===== Modelo =====
En los ejemplos que vamos a realizar van a usarse las siguientes clases Java y tablas, que solo mostraremos en formato UML. No vamos a poner el código fuente ni los ficheros de hibernate de mapeo ya que no todas la características que usan han sido explicadas en lecciones anteriores.
==== Modelo de Java ====
El modelo de clases Java es el siguiente:
class Profesor
Profesor : int id
Profesor : String nombre
Profesor : String ape1
Profesor : String ape2
==== Modelo de Tablas ====
El modelo de tablas es el siguiente:
class Profesor <
>
Profesor : INTEGER id
Profesor : VARCHAR nombre
Profesor : VARCHAR ape1
Profesor : VARCHAR ape2
===== Query =====
Pasemos ahora a ver las funcionalidades de la clase org.hibernate.Query|Query
==== list() ====
Pasemos ahora a ver con más detalle cómo funciona org.hibernate.Query#list()|list().
=== Lista de Objetos ===
Como ya hemos dicho el método org.hibernate.Query#list()|list() nos retorna una lista con todos los objetos que ha retornado la consulta. En caso de que no se encuentre ningún resultado se retornará una lista sin ningún elemento.
Query query = session.createQuery("SELECT p FROM Profesor p");
List profesores = query.list();
for (Profesor profesor : profesores) {
System.out.println(profesor.toString());
}
=== Lista de Array de Objetos ===
Tan y como veremos en la siguiente lección sobre HQL, también se permite que las consultas retornen datos escalares en vez de clases completas.
SELECT p.id,p.nombre FROM Profesor p
En la consulta podemos ver cómo en vez de retornar un objeto ''Profesor'' se retorna únicamente el código del profesor y su nombre.
En estos casos el método org.hibernate.Query#list()|list() retorna una lista con una Array de objetos con tantos elementos como propiedades hayamos puesto en la ''SELECT''.
Veamos ahora un ejemplo.
Query query = session.createQuery("SELECT p.id,p.nombre FROM Profesor p");
List
* En la línea 1 vemos cómo se crea el objeto org.hibernate.Query|Query con la consulta de datos escalares.
* En la línea 2 se ve que el método org.hibernate.Query#list()|list() retorna una lista de array de Objetos.Es decir 'List