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



