3

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

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

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

    ...
}

名前付きクエリを呼び出し、結果を Bean にマップする Hibernate コード:-

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  

    ...
}

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

ありがとう。

更新- 以下に最終的な解決策を追加しました。

4

4 に答える 4

1

カスタムの使用に関する@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();
于 2011-02-01T20:38:58.990 に答える
1

独自の ResultTransformer を実装する必要があります。これは非常に単純で、バンドルされている実装のソースを参照してインスピレーションを得ることができます。

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

于 2011-02-01T15:04:21.397 に答える
0

Bean を手動でビルドするだけです。

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

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

于 2011-02-01T15:29:16.437 に答える