我是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();
}


我现在的问题是:为什么这样做有效?

10-06 04:11