我是Hibernate的新手,正在尝试在Spring MVC应用程序中使用它。我有一个类似以下的自定义查询:
public List<MyResults> findEmployees() {
String queryString = "select E.firstname, E.lastname, A.city, A.state
from Employee E, Address A, where ...."; // whatever where clause
SQLQuery query = this.sessionFactory.getCurrentSession().createSQLQuery(queryString);
query.setString(...) // set query parameters
return query.list();
}
这行不通。查询运行,但它返回对象列表。
如何告诉Hibernate使用我的
MyResults
类?class MyResults {
private String firstName;
// other fields in the search
@Column(name = "FirstName")
String getFirstName() {
return firstName;
}
void setFirstName(String firstName) {
this firstName = firstName;
}
// other getters & setters
}
我也不确定
MyResults
需要什么注释?我已经尝试了几件事:
return (List<MyResults>)query.list();
虽然这个演员没有做到。
我试过使用ResultTransformer:
query.setResultTransformer(new AliasToBeanResultTransformer(MyResults.class)); //done before the return
但这会导致
ClassClastException:MyResults无法转换为java.util.Map。
有人可以告诉我如何在Hibernate中正确设置这种查询吗?
最佳答案
我发现的一种解决方案是按照建议使用NamedNativeQuery
,但将MyResults
设置为Entity
。像这样:
@Entity
@NamedNativeQuery(name = "findMyResult", query = "select E.firstname, E.lastname, A.city, A.state from Employee E, Address A, where ....", resultClass = MyResults.class)
class MyResults {
private String firstName;
// other fields in the search
@Column(name = "FirstName")
String getFirstName() {
return firstName;
}
void setFirstName(String firstName) {
this firstName = firstName;
}
// other getters & setters
}
但是请注意,
Entity
类未使用@Table
进行注释。然后在我的DAO课上:
public List<MyResults> checkResults() {
Query query = sessionFactory.getCurrentSession().getNamedQuery("findMyResult");
query.setParameter("employeeID", "1234");
return (List<MyResults>)query.list();
}
我现在的问题是:为什么这样做有效?