obtener - query native java
¿Puede Hibernate devolver una colección de objetos de resultados que no sean una lista? (4)
De Java Persistence con Hibernate :
- Un java.util.Map se puede mapear con
<map>
, preservando los pares clave y valor. Usejava.util.HashMap
para inicializar una propiedad. - Se puede mapear un
java.util.SortedMap
con el elemento<map>
, y el atributo de clasificación se puede establecer como un comparador u orden natural para la clasificación en memoria. Inicializa la colección con una instancia dejava.util.TreeMap
.
¿La API de Hibernate admite conjuntos de resultados de objetos en forma de una colección que no sea una lista?
Por ejemplo, tengo un proceso que ejecuta cientos de miles de iteraciones para crear algunos datos para un cliente. Este proceso utiliza registros de una tabla de valores (por ejemplo) para crear esta salida para cada iteración.
Con una lista, tendría que repetir la lista completa para encontrar un valor determinado, que es caro. Me gustaría poder devolver un TreeMap y especificar una clave mediante programación para poder buscar en la colección el valor específico que necesito. ¿Hibernate puede hacer esto por mí?
Si entiendo correctamente, carga un montón de datos de la base de datos en la memoria y luego los usa localmente buscando ciertos objetos en esa lista.
Si este es el caso, veo 2 opciones.
- No cargue todos los datos, pero para cada iteración acceda a la base de datos con una consulta que solo devuelva el registro específico que necesita. Esto hará más consultas a la base de datos, por lo que probablemente sea más lento, pero con mucho menos consumo de memoria. Esta solución podría mejorarse fácilmente agregando caché, de modo que la mayoría de los valores utilizados se obtendrán rápidamente. Por supuesto, necesitará alguna medida de rendimiento, pero generalmente estoy a favor de una solución ingenua con buen almacenamiento en caché, ya que el caché puede implementarse como una preocupación cruzada y ser muy transparente para el programador.
- Si realmente desea cargar todos sus datos en la memoria (que en realidad es una forma de almacenamiento en caché), el tiempo para transformar sus datos de una lista a un TreeMap (o cualquier otra estructura eficiente) probablemente será pequeño en comparación con el procesamiento completo. Entonces tú podrías hacer la transformación de datos tú mismo.
Como dije, en el caso general, preferiría una solución con almacenamiento en caché ...
Supongo que se refiere al método Query.list()
. De ser así: no, no hay forma de devolver resultados de alto nivel que no sean una List
. Si recibe demasiados resultados, ¿por qué no envía una consulta más restringida a la base de datos? Si la consulta es difícil de restringir, puede rellenar su propio Map
con los contenidos de la List
de Hibernate y luego descartar la lista.
Sí, eso se puede hacer.
Sin embargo, es probable que deba hacer que su clase de dominio implemente Comparable
; No creo que puedas hacerlo usando un Comparador.
Editar: Parece que he entendido mal la pregunta. Si está hablando del resultado de una consulta ad hoc, lo anterior no lo ayudará. Podría ser posible hacerlo vinculando un objeto con una propiedad TreeMap a una vista de base de datos si la consulta es fija.
Y, por supuesto, siempre puede construir el mapa usted mismo con muy poco trabajo y gastos generales de procesamiento.