用于SQL的变换器返回非实体pojo类

时间:2011-08-09 18:16:43

标签: java hibernate hql transform

嗨我想在hibernate中使用Transformers返回结果查询的非实体类。

我的pojo课程是

Hibernate代码是

    public class TestPojo {

    private String id=null;
    private String companyname=null;
    private String fullname=null;
    private String empid=null;
    private String dateallocated=null;
    public TestPojo() {

    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCompanyname() {
        return companyname;
    }
    public void setCompanyname(String companyname) {
        this.companyname = companyname;
    }
    public String getFullname() {
        return fullname;
    }
    public void setFullname(String fullname) {
        this.fullname = fullname;
    }
    public String getEmpid() {
        return empid;
    }
    public void setEmpid(String empid) {
        this.empid = empid;
    }
    public String getDateallocated() {
        return dateallocated;
    }
    public void setDateallocated(String dateallocated) {
        this.dateallocated = dateallocated;
    }




        SQLQuery query = session.createSQLQuery("select t.id as id,t.companyname      as           companyname,e.fullname as fullname,e.empid as empid,ca.dateallocated as    dateallocated from   bw_tempclientdetails t,  bw_employee_details e, bw_clientallocation   ca   where  e.empid=ca.empid and  ca.companyname=t.companyname");

         query.addScalar("id");    
         query.addScalar("companyname");
         query.addScalar("fullname");
         query.addScalar("empid");
         query.addScalar("dateallocated");


query.setResultTransformer(Transformers.aliasToBean(TestPojo.class));
List<TestPojo> list=query.list();

但是,当我运行我的应用程序时,我收到此错误。 org.hibernate.PropertyAccessException:调用org.bluewhale.model.TestPojo.id的setter时发生IllegalArgumentException

在这里输入代码

1 个答案:

答案 0 :(得分:2)

如你的评论所述: -

query.addScalar("id",Hibernate.STRING);
query.addScalar("companyname",Hibernate.STRING); 
query.addScalar("fullname",Hibernate.STRING); 
query.addScalar("empid",Hibernate.STRING); 
query.addScalar("dateallocated",Hibernate.STRING);
query.addScalar("status",Hibernate.STRING); 
query.setResultTransformer(Transformers.aliasToBean(TestPojo.class)); 
list=query.list();

解释

为了解释一般,Hibernate选择最合适的数据表示方式。所以我假设IDs以数字格式存储。因此,Hibernate将它们视为LongaliasToBean方法调用默认构造函数来生成TestPojo对象。然后,它搜索其自推导类型的setter方法。在这种情况下,它可能会搜索带签名的方法

  public void setId(Long id)

此调用转到重载方法public void setId(String id)

由于Long不是String,因此您获得了IllegalArgumentException
你在解决方案中所做的是明确定义要作为类型String的值,因此现在Hibernate使用的setter方法变为public void setId(String id)因此解决了你的问题。

请注意: - 如果您要使用addScalar(),则需要将其用于所有需要的数据成员。