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

时间:2016-05-23 21:14:00

标签: java hibernate

我是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中正确设置这种查询吗?

3 个答案:

答案 0 :(得分:0)

ClassClastException: MyResults cannot be cast to java.util.Map的原因是Hibernate将列名称的别名转换为大写 - firstName变为FIRSTNAME。它确实需要setFIRSTNAME()中的setter DTO。不知道,这是一个错误或功能。

要解决此问题,请参阅我对您的其他问题的回答:

mapping Hibernate query results to custom class?

答案 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");