栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将Hibernate查询结果映射到自定义类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将Hibernate查询结果映射到自定义类?

select firstName, lastName from Employeequery.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。它试图找到名字一个getter getFIRSTNAME(),和setter setFIRSTNAME()在DTO使用这种策略

    PropertyAccessStrategyChainedImpl propertyAccessStrategy = new PropertyAccessStrategyChainedImpl( PropertyAccessStrategyBasicImpl.INSTANCE, PropertyAccessStrategyFieldImpl.INSTANCE, PropertyAccessStrategyMapImpl.INSTANCE    );

PropertyAccessStrategyMapImpl.INSTANCEHibernate
认为,仅适合使用。因此,在此之后,它尝试进行转换(Map)MyResults。

public void set(Object target, Object value, SessionFactoryImplementor factory) {    ( (Map) target ).put( propertyName, value );}

不知道,这是错误或功能。

怎么解决

使用带引号的别名

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

使用自定义结果转换器

另一种方式来解决这个问题-使用忽略方法名的情况下(结果转换

getFirstName()
getFIRSTNAME()
)。你可以编写自己的代码或使用FluentHibernateResultTransformer。你将不需要使用引号和别名(如果你的列名称等于DTO名称)。

只需从项目页面下载该库(不需要其他jar):fluent-hibernate。

String sql = "select firstName, lastName from Employee";List<Results> employees = session.createSQLQuery(sql)        .setResultTransformer(new FluentHibernateResultTransformer(Results.class))        .list();


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号