Hibernate:クエリ名のストアドプロシージャのカスタム列名のマッピング
-
27-10-2019 - |
質問
現在、ストアドプロシージャをラップする次の名前のクエリがあります。-
<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_first
と name_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
他のヒント
カスタムの使用に関する @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を不変にすることができます。
これに記載されているソリューションを使用できます ブログ投稿。うまく機能し、うまく再利用できます。
所属していません StackOverflow