Hibernate: Mapeo de nombres de columnas personalizadas en el procedimiento almacenado llamado Query

StackOverflow https://stackoverflow.com/questions/4863883

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.

¿Fue útil?

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

https://github.com/Hibernate/Hibernate-Core/Tree/Master/Hibernate-Core/Src/Main/Java/org/Hibernate/Transform

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top