Hibernate: Mapping benutzerdefinierte Spaltennamen in gespeicherter Prozedur mit dem Namen Abfrage zuordnen

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

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.

War es hilfreich?

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

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top