Hibernate: Mapeo de nombres de columnas personalizadas en el procedimiento almacenado llamado Query
-
27-10-2019 - |
Pregunta
Actualmente tengo la siguiente consulta con nombre que envuelve un procedimiento almacenado:-
<hibernate-mapping>
<sql-query name="mySp">
<return-scalar column="name_first" type="string" />
<return-scalar column="name_last" type="string" />
{ call some_sp :param }
</sql-query>
</hibernate-mapping>
Las columnas name_first
y name_last
son los nombres exactos de la columna devueltos por el procedimiento almacenado. Creé un frijol que contiene los mismos nombres de columnas para poder mapear el resultado consultado en ese bean.
public class MyBean {
private String name_first;
private String name_last;
...
}
El código de hibernación que llama a la consulta nombrada y mapea el resultado en el bean:-
MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
.getNamedQuery("mySp")
.setParameter("param", param)
.setResultTransformer(Transformers.aliasToBean(MyBean.class))
.uniqueResult();
Todos estos funcionan bien, pero en lugar de confiar en los nombres de la columna del procedimiento almacenado, quiero usar los nombres de mis propios columnas en MyBean
, por ejemplo:-
public class MyBean {
private String firstName; // instead of name_first
private String lastName; // instead of name_last
...
}
¿Cómo mapeo los nombres de mis columnas con las columnas del procedimiento almacenado en mi consulta nombrada arriba?
Gracias.
ACTUALIZAR - Agregué mi solución final a continuación.
Solución
Deberá implementar su propio resultado resultado. Es realmente simple, y puedes ver la fuente de las implementaciones agrupadas para inspirarse.
http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/transform/resulttransformer.html
Otros consejos
Basado en la respuesta de @partenon sobre el uso de una personalización ResultTransformer
, aquí está la solución final:-
MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
.getNamedQuery("mySp")
.setParameter("param", param)
.setResultTransformer(new BasicTransformerAdapter() {
private static final long serialVersionUID = 1L;
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
String firstName = (String) tuple[0];
String lastName = (String) tuple[1];
return new MyBean(firstName, lastName);
}
})
.uniqueResult();
Simplemente construya tu frijol manualmente:
Object[] columns = (Object[]) sessionFactory.getCurrentSession()
.getNamedQuery("mySp")
.setParameter("param", param)
.uniqueResult();
MyBean myBean = new MyBean((String) columns[0], (String) columns[1]);
Esto tiene una ventaja adicional: le permite hacer que su mybean sea inmutable.
Puede usar la solución descrita en este entrada en el blog. Funciona muy bien y se puede reutilizar bien.