我是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中正确设置这种查询吗?
答案 0 :(得分:0)
ClassClastException: MyResults cannot be cast to java.util.Map
的原因是Hibernate将列名称的别名转换为大写 - firstName
变为FIRSTNAME
。它确实需要setFIRSTNAME()
中的setter DTO
。不知道,这是一个错误或功能。
要解决此问题,请参阅我对您的其他问题的回答:
答案 1 :(得分:0)
我找到的一个解决方案是按建议使用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();
}
我现在的问题是:为什么这样做?
答案 2 :(得分:-1)
您可以改为使用命名查询。
@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
}
命名查询是全局访问,可以使用getNameQuery
进行调用Query query = session.getNamedQuery("findMyResult")
.setString("employee_id", "7277");