Hibernate: mappatura dei nomi delle colonne personalizzate nella procedura memorizzata denominata query

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

Domanda

Attualmente ho le seguenti query denominate che avvolge una procedura memorizzata:-

<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>

Le colonne name_first e name_last sono i nomi esatti della colonna restituiti dalla procedura memorizzata. Ho creato un fagiolo che contiene gli stessi nomi di colonne in modo da poter mappare il risultato interrogato in quel fagiolo.

public class MyBean {
    private String  name_first;
    private String  name_last;  

    ...
}

Il codice Hibernate che chiama la query denominata e mappa il risultato nel fagiolo:-

MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
                        .getNamedQuery("mySp")
                        .setParameter("param", param)
                        .setResultTransformer(Transformers.aliasToBean(MyBean.class))
                        .uniqueResult();

Tutti questi funzionano bene, ma invece di fare affidamento sui nomi delle colonne dalla procedura memorizzata, voglio usare i nomi delle mie colonne in MyBean, Per esempio:-

public class MyBean {
    private String  firstName; // instead of name_first
    private String  lastName;  // instead of name_last  

    ...
}

Come posso mappare i nomi delle mie colonne contro le colonne della procedura memorizzata nella mia query denominata sopra?

Grazie.

AGGIORNARE - Ho aggiunto la mia soluzione finale di seguito.

È stato utile?

Soluzione

Dovrai implementare il tuo risultato Trasformer. È davvero semplice e puoi guardare la fonte delle implementazioni in bundle per l'ispirazione.

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

Altri suggerimenti

Basato sulla risposta di @Partenon sull'uso di un'usanza ResultTransformer, ecco la soluzione finale:-

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();

Costruisci manualmente il tuo fagiolo:

Object[] columns = (Object[]) sessionFactory.getCurrentSession()
                        .getNamedQuery("mySp")
                        .setParameter("param", param)
                        .uniqueResult();
MyBean myBean = new MyBean((String) columns[0], (String) columns[1]);

Questo ha un ulteriore vantaggio: ti consente di rendere immutabile il tuo mybean.

È possibile utilizzare la soluzione descritta in questo post sul blog. Funziona alla grande e può essere riutilizzato bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top