Mise en veille prolongée: les noms de colonnes Mapping personnalisés dans la procédure stockée appelée requête
-
27-10-2019 - |
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
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.
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.