質問

現在、ストアドプロシージャをラップする次の名前のクエリがあります。-

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

name_firstname_last 正確な列名は、ストアドプロシージャによって返されます。同じ列名を含む豆を作成して、クエリの結果をその豆にマップできるようにしました。

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

    ...
}

名前付きクエリを呼び出して結果をBeanにマッピングする冬眠コード: -

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

これらはすべて正常に動作しますが、ストアドプロシージャの列名に依存する代わりに、自分の列名をで使用したい MyBean, 、 例えば:-

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

    ...
}

上記の名前のクエリのストアドプロシージャの列に対して列名をマップするにはどうすればよいですか?

ありがとう。

アップデート - 最後のソリューションを以下に追加しました。

役に立ちましたか?

解決

独自の結果トランスフォーマーを実装する必要があります。それは本当に簡単で、インスピレーションのためにバンドルされた実装のソースを見ることができます。

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

他のヒント

カスタムの使用に関する @partenonの答えに基づいて ResultTransformer, 、これが最終的な解決策です: -

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();

豆を手動で構築するだけです:

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

これにはさらに1つの利点があります。これにより、MyBeanを不変にすることができます。

これに記載されているソリューションを使用できます ブログ投稿。うまく機能し、うまく再利用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top