java – 将Hibernate查询结果映射到自定义类?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 将Hibernate查询结果映射到自定义类?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2801字,纯文字阅读大概需要5分钟。
内容图文
![java – 将Hibernate查询结果映射到自定义类?](/upload/InfoBanner/zyjiaocheng/712/7069059fc9bb4eed94ce83495ecd41e7.jpg)
跟进我昨天发布的一个问题:How to populate POJO class from custom Hibernate query?
有人能给我看一个如何在Hibernate中编写以下SQL的例子,并正确得到结果吗?
SQL:
select firstName, lastName
from Employee
如果可能在Hibernate中,我想做的是将结果放在他们自己的基类中:
class Results {
private firstName;
private lastName;
// getters and setters
}
我相信它可以在JPA中使用(使用EntityManager),但我还没有弄清楚如何在Hibernate中使用它(使用SessionFactory和Session).
我正在努力学习更好的Hibernate,甚至这个“简单”的查询也让人感到困惑,知道Hibernate返回结果的形式,以及如何将结果映射到我自己的(基础)类.所以在DAO例程结束时,我会这样做:
List<Results> list = query.list();
返回结果列表(我的基类).
解决方法:
select firstName, lastName from Employee
query.setResultTransformer(Transformers.aliasToBean(MyResults.class));
由于异常,你不能在Hibernate 5和Hibernate 4(至少是Hibernate 4.3.6.Final)上使用上面的代码
java.lang.ClassCastException: com.github.fluent.hibernate.request.persistent.UserDto cannot be cast to java.util.Map
at org.hibernate.property.access.internal.PropertyAccessMapImpl$SetterImpl.set(PropertyAccessMapImpl.java:102)
问题是Hibernate将列名的别名转换为大写 – firstName变为FIRSTNAME.它尝试使用这样的策略在DTO中找到名为getFIRSTNAME()的getter和setter setFIRSTNAME()
PropertyAccessStrategyChainedImpl propertyAccessStrategy = new PropertyAccessStrategyChainedImpl(
PropertyAccessStrategyBasicImpl.INSTANCE,
PropertyAccessStrategyFieldImpl.INSTANCE,
PropertyAccessStrategyMapImpl.INSTANCE
);
鉴于Hibernate,只有PropertyAccessStrategyMapImpl.INSTANCE才适合.所以在那之后它尝试进行转换(Map)MyResults.
public void set(Object target, Object value, SessionFactoryImplementor factory) {
( (Map) target ).put( propertyName, value );
}
不知道,这是一个bug或功能.
怎么解决
使用带引号的别名
public class Results {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
String sql = "select firstName as \"firstName\",
lastName as \"lastName\" from Employee";
List<Results> employees = session.createSQLQuery(sql).setResultTransformer(
Transformers.aliasToBean(Results.class)).list();
使用自定义结果转换器
另一种解决问题的方法 – 使用忽略方法名称的结果转换器case(将getFirstName()视为getFIRSTNAME()).您可以自己编写或使用FluentHibernateResultTransformer.您不需要使用引号和别名(如果列名等于DTO名称).
只需从项目页面下载库(它不需要额外的罐子):fluent-hibernate.
String sql = "select firstName, lastName from Employee";
List<Results> employees = session.createSQLQuery(sql)
.setResultTransformer(new FluentHibernateResultTransformer(Results.class))
.list();
此变换器也可用于嵌套投影:How to transform a flat result set using Hibernate
内容总结
以上是互联网集市为您收集整理的java – 将Hibernate查询结果映射到自定义类?全部内容,希望文章能够帮你解决java – 将Hibernate查询结果映射到自定义类?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。