Hibernate: Mapping benutzerdefinierte Spaltennamen in gespeicherter Prozedur mit dem Namen Abfrage zuordnen
-
27-10-2019 - |
Frage
Ich habe derzeit die folgende benannte Abfrage, die sich um eine gespeicherte Prozedur wickelt:-
<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>
Die Säulen name_first
und name_last
sind die genauen Spaltennamen, die durch die gespeicherte Prozedur zurückgegeben werden. Ich habe eine Bean erstellt, die dieselben Spaltennamen enthält, damit ich das abfragte Ergebnis in diese Bohne zuordnen kann.
public class MyBean {
private String name_first;
private String name_last;
...
}
Der Hibernate-Code, der die benannte Abfrage aufruft und das Ergebnis in die Bean kartiert:-
MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
.getNamedQuery("mySp")
.setParameter("param", param)
.setResultTransformer(Transformers.aliasToBean(MyBean.class))
.uniqueResult();
All diese Funktionen funktionieren einwandfrei, aber anstatt sich auf die Spaltennamen aus der gespeicherten Prozedur zu verlassen, möchte ich meine eigenen Spaltennamen in verwenden MyBean
, zum Beispiel:-
public class MyBean {
private String firstName; // instead of name_first
private String lastName; // instead of name_last
...
}
Wie kann ich meine Spaltennamen in meiner genannten Abfrage oben gegen die Spalten des gespeicherten Prozedurs zuordnen?
Vielen Dank.
AKTUALISIEREN - Ich habe meine endgültige Lösung unten hinzugefügt.
Lösung
Sie müssen Ihr eigenes resultTransformer implementieren. Es ist wirklich einfach und Sie können die Quelle der gebündelten Implementierungen als Inspiration betrachten.
http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/transform/resulttransformer.html
Andere Tipps
Basierend auf der Antwort von @parteNon auf die Verwendung eines Brauchs ResultTransformer
, Hier ist die endgültige Lösung:-
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();
Bauen Sie einfach Ihre Bohne manuell:
Object[] columns = (Object[]) sessionFactory.getCurrentSession()
.getNamedQuery("mySp")
.setParameter("param", param)
.uniqueResult();
MyBean myBean = new MyBean((String) columns[0], (String) columns[1]);
Dies hat einen zusätzlichen Vorteil: Sie können Ihre MyBean unveränderlich machen.
Sie können die darin beschriebene Lösung verwenden Blogeintrag. Es funktioniert großartig und kann gut wiederverwendet werden.