Hibernate provee algúnas formas de ejecutar un mismo Query HQL devolviendo los frutos de diferentes formas. La interfaz que se emplea para la ejecución de queries es precisamente org.hibernate.Query que provee 3 metodos para conseguir los frutos de un Query list() iterate() y scroll().

Se analizarán los dos primeros en cuanto a eficiencia y conveniencia de uso.

Contenido [ocultar]
1 Query.list()
2 Query.iterate()
3 Conclusión
4 Ver También
Query.list()
El método Query.list() devuelve en una colección todos los frutos del Query. Es decir en la colección se encuentran instanciadas todas las entidades que corresponden al fruto de la ejecución del HQL por lo tanto el ResultSet subyacente de la conexión JDBC se cierra ya que no se requiere más.

Notar que esta opción realiza una única comunicación con la fundamento de datos en donde se traen todos los frutos y necesita que haya memoria suficiente para Guardar todos los objetos resultantes del query. Si la porción de frutos es extensa el delay del entrada a la fundamento será notorio.

Ejemplo

Query q = session.createQuery(from Auto auto where auto.aniocreacion 1985 )
List autos = q.list()
Query.iterate()
El método Query.iterate() devuelve un iterador java.util.Iterator para iterar los frutos del query. En este caso las entidades se instancian a demanda es decir con cada llamada al método Iterator.next() que devolverá la entidad de la posición actual del iterador.

Para resolver esto Hibernate ejecuta el query obteniendo sólo los ids de las entidades y en cada llamada al método Iterator.next() ejecuta la consulta particular para conseguir la entidad completa. Esto se traduce en una mayor porción de entradas a la fundamento de datos resultando en un mayor tiempo de procesamiento total. La ventaja de este método es que no se necesita que todas las entidades estén cargadas en memoria simultáneamente consumiendo memoria innecesariamente.

Para optimizar la obtención de entidades haciendo que no se realice un entrada a la fundamento por cada llamada al metodo Iterator.next() se puede fijar la porción de frutos a traer en cada entrada o fetch. Esto se configura llamando al método Query.setFetchSize() antes de la ejecución de la consulta.

Ejemplo

Query q = session.createQuery(from Auto auto where auto.aniocreacion 1985 )
q.setFetchSize(10) // se obtendrán 10 frutos en cada entrada a la fundamento.
Iterator iter = q.iterate()
while ( iter.hasNext() ) {
Auto auto = (Auto) iter.next() // fetch the object
...

}
Debe tenerse propia cuidado en que no se cierre la sesión de hibernate entretanto se emplea el iterador de lo opuesto no se podrán conseguir los frutos subsiguientes de la fundamento de datos.