Hibernate:在存储过程命名查询中映射自定义列名称
我目前有以下围绕存储过程的命名查询:-
<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
是存储过程返回的确切列名称。我创建了一个包含相同列名的 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< 中使用我自己的列名/code>,例如:-
public class MyBean {
private String firstName; // instead of name_first
private String lastName; // instead of name_last
...
}
如何将我的列名称映射到上面命名查询中的存储过程的列?
谢谢。
更新 - 我在下面添加了最终的解决方案。
I currently have the following named query that wraps around a stored procedure:-
<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>
The columns name_first
and name_last
are the exact column names returned by the stored procedure. I created a bean that contains the same column names so that I can map the queried result into that bean.
public class MyBean {
private String name_first;
private String name_last;
...
}
The Hibernate code that calls the named query and map the result into the bean:-
MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
.getNamedQuery("mySp")
.setParameter("param", param)
.setResultTransformer(Transformers.aliasToBean(MyBean.class))
.uniqueResult();
All of these work fine, but instead of relying on the column names from the stored procedure, I want to use my own column names in MyBean
, for example:-
public class MyBean {
private String firstName; // instead of name_first
private String lastName; // instead of name_last
...
}
How do I map my column names against the stored procedure's columns in my named query above?
Thanks.
UPDATE - I added my final solution below.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要实现自己的 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
You'll need to implement your own ResultTransformer. It's really simple, and you can look at the source of the bundled implementations for inspiration.
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
的回答,这是最终的解决方案:-Based on @partenon's answer on using a custom
ResultTransformer
, here's the final solution:-只需手动构建您的 bean:
这还有一个额外的优点:它允许您使 MyBean 不可变。
Just build your bean manually :
This has one additional advantage : it allows you to make your MyBean immutable.
对于非托管和非实体类型,您仍然希望使用支持 @Column 注释的类型转换器。方法如下:
这是实体类型:
这是存储库函数代码:
For non-managed and non-entity types you still want to use types transformer that do support @Column annotation. Here's how:
Here's entity type:
Here's repository function code: