Hibernate: mappatura dei nomi delle colonne personalizzate nella procedura memorizzata denominata query
-
27-10-2019 - |
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.
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
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.