sesiones persistencia parametros ejemplo datos curso consultas con cerrar java hibernate hibernate-mapping

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:

  1. He intentado usar q.addEntity(Y.class) pero esto falla con: org.hibernate.MappingException: Unknown entity com.mycompany.Y
  2. q.setResultTransformer(Transformers.aliasToBean(Y.class)); pero esto falla con: org.hibernate.PropertyNotFoundException: Could not find setter for some_property . X tiene un campo llamado someProperty 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.
  3. 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); }