2011-08-09 17 views
1

您好我試圖在休眠狀態下使用Transformers返回非實體類的結果查詢。用於SQL的變換器返回非實體pojo類

我的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

的二傳手發生拋出:IllegalArgumentException

進入這裏

+0

問題解決了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(AllocatedClients.class)); list = query.list(); 歡呼聲! –

回答

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對象。然後搜索其自推導的類型的其設置方法。在這種情況下可能會搜索的方法與簽名

public void setId(Long id) 

這個電話將轉入重載方法public void setId(String id)

由於Long不是String你得到一個IllegalArgumentException
你在解決方案中做了什麼明確定義值將被採取爲類型String因此,現在Hibernate使用的setter方法變成public void setId(String id)因此解決您的問題。

請注意: - 如果您要使用addScalar(),則需要將其用於所有需要的數據成員。