Java 如何从自定义Hibernate查询填充POJO类?

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

我不熟悉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
   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
中的setter
setFIRSTNAME()
。不知道,这是一个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();
}