java - parametros - persistencia hibernate netbeans
¿Cómo asignar mejor los resultados de una consulta SQL a un objeto Java sin entidad usando Hibernate? (3)
Consulte el capítulo de la documentación sobre consultas SQL .
Puede usar el método addScalar()
para especificar qué tipo de Hibernat debe usar para una columna dada.
Y puede usar alias para asignar los resultados con las propiedades del bean:
select t.some_property as someProperty, ..., myfunc(:param) as result from X_table_name t
O bien, (y aunque requiere algunas líneas de código, es mi solución preferida), simplemente puede hacer el mapeo usted mismo:
List<Object[]> rows = query.list();
for (Object[] row : rows) {
Foo foo = new Foo((Long) row[0], (String) row[1], ...);
}
Esto evita la reflexión, y te permite controlar todo.
Tengo una entidad Java administrada por Hibernate llamada X y una función SQL nativa (myfunc) a la que llamo desde una consulta SQL de Hibernate en este sentido:
SQLQuery q = hibernateSession.createSQLQuery(
"SELECT *, myfunc(:param) as result from X_table_name"
);
Lo que quiero hacer es asignar todo lo devuelto de esta consulta a una clase (no necesariamente administrada por Hibernate) llamada Y. Y debería contener todas las propiedades / campos de X más el result
devuelto por myfunc
, por ejemplo, Y podría extender la clase X y agregar un campo de "resultado".
Lo que he intentado:
- He intentado usar
q.addEntity(Y.class)
pero esto falla con:org.hibernate.MappingException: Unknown entity com.mycompany.Y
-
q.setResultTransformer(Transformers.aliasToBean(Y.class));
pero esto falla con:org.hibernate.PropertyNotFoundException: Could not find setter for some_property
. X tiene un campo llamadosomeProperty
con el getter y setter apropiado, pero en este caso no parece que Hibernate asigne el nombre de la columna (some_property) al nombre de campo correcto. -
q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
devuelve un Mapa, pero los valores no siempre son del tipo esperado por el campo correspondiente en X. Por ejemplo, los campos en X de tipo enum y Fecha no pueden asignarse directamente desde el Mapa devuelto por la consulta SQL (donde son Cadenas).
¿Cuál es la forma adecuada de hacer frente a esta situación?
En primer lugar, debe declarar la entidad en el archivo xml de configuración de hibernación algo como esto: ..... class = "ruta a su entidad"
O puede hacer lo mismo programáticamente antes de realizar la consulta.
Fácil. Convierte las filas en Map<String, Object>
:
final org.hibernate.Query q = session.createSQLQuery(sql);
q.setParameter("geo", geo);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
final List<Map<String, Object>> src = q.list();
final List<VideoEntry> results = new ArrayList<VideoEntry>(src.size());
for (final Map<String, Object> map:src) {
final VideoEntry entry = new VideoEntry();
BeanUtils.populate(entry, map);
results.add(entry);
}