嗨我想在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
在这里输入代码
答案 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将它们视为Long
。 aliasToBean
方法调用默认构造函数来生成TestPojo
对象。然后,它搜索其自推导类型的setter方法。在这种情况下,它可能会搜索带签名的方法
public void setId(Long id)
此调用转到重载方法public void setId(String id)
由于Long
不是String
,因此您获得了IllegalArgumentException
。
你在解决方案中所做的是明确定义要作为类型String
的值,因此现在Hibernate使用的setter方法变为public void setId(String id)
因此解决了你的问题。
请注意: - 如果您要使用addScalar()
,则需要将其用于所有需要的数据成员。