Java 如何从自定义Hibernate查询填充POJO类?
我不熟悉Hibernate,并尝试在SpringMVC应用程序中使用它。我有一个自定义查询,如下所示:Java 如何从自定义Hibernate查询填充POJO类?,java,hibernate,Java,Hibernate,我不熟悉Hibernate,并尝试在SpringMVC应用程序中使用它。我有一个自定义查询,如下所示: public List<MyResults> findEmployees() { String queryString = "select E.firstname, E.lastname, A.city, A.state from Employee E, Address A, where ...."; // whatever where clause SQL
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();
}
我也不确定MyResults
需要什么注释
我试过两种方法:
return (List<MyResults>)query.list();
但这会导致
ClassScratException:MyResults无法转换为java.util.Map
有人能告诉我如何在Hibernate中正确设置此类查询吗?您可以改用命名查询
@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");
classclatexception:MyResults无法转换为java.util.Map
的原因是Hibernate将列名的别名转换为大写-firstName
变成了firstName
。而且它确实需要DTO
中的settersetFIRSTNAME()
。不知道,这是一个bug或特性
要解决此问题,请参见我对您的其他问题的回答:
我发现的一个解决方案是按照建议使用
namedNavity equiry
,但将MyResults
作为实体。像这样:
@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
}
但是请注意,实体
类不是用@表
注释的
然后在我的DAO课上:
public List<MyResults> checkResults() {
Query query = sessionFactory.getCurrentSession().getNamedQuery("findMyResult");
query.setParameter("employeeID", "1234");
return (List<MyResults>)query.list();
}
公共列表检查结果(){
Query Query=sessionFactory.getCurrentSession().getNamedQuery(“findMyResult”);
setParameter(“employeeID”、“1234”);
return(List)query.List();
}
我现在的问题是:为什么这样做?请添加完整的MyResults
类。不清楚:MyResults
是DTO
还是实体。它是普通结构还是嵌套对象。它是DTO,而不是实体。只是一个简单的结构。一些带有getter和setter的字段变量。仅此而已。因此您不需要此@Column(name=“FirstName”)
我尝试了此解决方案,但现在找不到命名查询:(在我的DAO中,我有:query query=this.sessionFactory.getCurrentSession().getNamedQuery(“findMyResult”)query.setParameter(“员工id”,“7277”);抱歉,我的评论没有结束:我尝试了这个解决方案,但现在找不到命名的查询:(在我的DAO中:List checkResults(String employeeID){query query query=this.sessionFactory.getCurrentSession().getNamedQuery(“findMyResult”)query.setParameter(“employee_id”,employeeID);List List=query.List();return List;}但它没有找到“findMyResults”,尽管应该在我的配置中扫描该类,因为它与SessionFactory正在扫描的其他实体类放在一起。非实体类可以有命名查询吗?@Chris:See:NamedNativeQuery注释可以应用于实体或映射的超类。因此答案是否。@Table
如果您有@Entity
注释。我使用@Table
来指定一个表名。它是有效的,因为@NamedNativeRequesty
是一种JPA方式,所以不使用转换器。@Chris:请看:NamedNativeRequesty注释可以应用于一个实体或映射的超类。因此,如果您使用@Entity
它是有效的。但我认为,这溶液气味。@dur我必须同意溶液气味:)我自己也不喜欢。我的一个同事只是玩弄了一些东西,然后让它发挥作用。我想我的问题是,我对Hibernate的基础知识了解不够,无法真正了解它的本质。我觉得我在向它扔代码,而不了解它的基本原理。
@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
}
public List<MyResults> checkResults() {
Query query = sessionFactory.getCurrentSession().getNamedQuery("findMyResult");
query.setParameter("employeeID", "1234");
return (List<MyResults>)query.list();
}