2011-11-15 69 views
14

我有一個SQL查詢中沒有駝峯如下:使用ResultTransformer與createSQLQuery迫使實體領域

List<Employee> employees = getCurrentSession() 
        .createSQLQuery(
          "select" 
            + e.id as id,e.first_name as firstName,e.password as password 
            + "from employee e,employee_role er,role r where e.employee_id=er.employee_id and er.role_id=r.role_id and r.name='ROLE_ADMIN' ") 
        .setResultTransformer(Transformers.aliasToBean(Employee.class)) 
        .list(); 

我有所謂的firstName員工的屬性,而是試圖上面DAO在單元測試中運行時,我我得到以下異常:

org.hibernate.PropertyNotFoundException: Could not find setter for firstname on class com.app.domain.Employee 

我不知道hibernate從這個firstname屬性獲取的位置?我沒有在我的查詢中正確嗎?

任何方式解決方法是改變名字的財產,和getter,setter方法也 但任何想法,爲什麼Hibernate是作出這樣的行爲,以及如何避免它,因爲我想在我的域名使用駝峯,請指教。

回答

21

您可以使用addScalar(String columnAlias, Type type)顯式聲明您的本機SQL的列別名:

getCurrentSession() 
    .createSQLQuery("select e.id as id,e.first_name as firstName,e.password as password from xxxxxx") 
       .addScalar("id",StandardBasicTypes.INTEGER) 
       .addScalar("firstName",StandardBasicTypes.STRING) 
       .addScalar("password",StandardBasicTypes.STRING) 
       .setResultTransformer(Transformers.aliasToBean(Employee.class)) 
       .list(); 
+0

addScalar + select在查詢中也是如此? –

+0

我認爲是這樣的,因爲只有在沒有'select as'的情況下使用'addScalar()'纔會給我帶來錯誤。 –

12

對於更簡單的解決方案,請將發送到服務器的查詢中的標識符雙引號。代替

e.first_name as firstName 

應該讀

e.first_name as "firstName" 

在PostgreSQL,雙引號的標識符力區分大小寫。沒有引用,它(大部分)遵循SQL標準並摺疊成單個案例(儘管標準是大寫的小寫)。