Mise en veille prolongée: les noms de colonnes Mapping personnalisés dans la procédure stockée appelée requête

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

Question

J'ai actuellement la requête suivante du nom qui se enroule autour d'une procédure stockée: -

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

Les colonnes name_first et name_last sont les noms exacts des colonnes retournées par la procédure stockée. J'ai créé un haricot qui contient les mêmes noms de colonnes afin que je puisse cartographier le résultat dans le grain de café interrogé.

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

    ...
}

Le code Hibernate qui appelle la requête du nom et de la carte le résultat dans la fève: -

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

Tous ces fins de travail, mais au lieu de compter sur les noms de colonnes de la procédure stockée, je veux utiliser mes propres noms de colonnes dans MyBean, par exemple: -

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

    ...
}

Comment puis-je mapper mes noms de colonnes contre les colonnes de la procédure stockée dans ma requête nommée ci-dessus?

Merci.

UPDATE -. J'ai ajouté ma solution finale ci-dessous

Était-ce utile?

La solution

Vous aurez besoin de mettre en œuvre votre propre ResultTransformer. Il est très simple, et vous pouvez regarder la source des mises en œuvre pour l'inspiration empaquetés.

http: //docs.jboss. org / veille prolongée / core / 3,6 / javadocs / org / veille prolongée / transformer / ResultTransformer.html

https: //github.com/hibernate/hibernate-core/tree/master/hibernate-core/src/main/java/org/hibernate/transform

Autres conseils

Basé sur @ réponse de partenon sur l'utilisation d'un ResultTransformer personnalisé, voici la solution 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();

Il suffit de construire votre haricot manuellement:

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

Ceci a un avantage supplémentaire. Il vous permet de rendre votre immuable MyBean

Vous pouvez utiliser la solution décrite dans cette Blog post . Il fonctionne très bien et peut être réutilisé bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top