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

有人可以向我展示如何在Hibernate中编写以下SQL并正确获取结果的示例吗?

SQL:

select firstName, lastName

from Employee

如果可能的话,我想做的就是将结果放入自己的基类中:

class Results {

private firstName;

private lastName;

// getters and setters

}

我相信在JPA(使用EntityManager)中是可能的,但是我还没有弄清楚如何在Hibernate(使用SessionFactorySession)中做到这一点。

我试图更好地学习Hibernate,即使这个“简单”查询也令人困惑,无法知道Hibernate以哪种形式返回结果,以及如何将结果映射到我自己的(基)类中。因此,在DAO例程结束时,我将执行以下操作:

List<Results> list = query.list();

返回Listof Results(my base class)。

回答:

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。它试图找到名字一个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();

以上是 将Hibernate查询结果映射到自定义类? 的全部内容, 来源链接: utcz.com/qa/422891.html

回到顶部