使用hibernate3的createSQLQuery遇到的問題 爲了給訪問加速,把DAO中的一些HQL的操作改成了SQL,其實最主要的原因是:操作的是多張表,返回的數據也來源於多個表的字段; String sql = “select A.id ID, A.name NAME, B.salary SALARY from employee A , Salary B where.......”; Query query =getSession().createSQLQuery(sql) .setResultTransformer(Transformers.aliasToBean(ReturnEmployee.class)); 由於返回的ID, NAME, SALARY 非一個和表對應的一個BEAN,所以自己需要建立一個ReturnEmployee的BEAN,屬性包括ID, NAME, SALARY;在mysql下調試,成功。 但是在ORACLE環境下卻報錯: org.hibernate.PropertyNotFoundException: Could not find setter for ID on class com.ReturnEmployee 經過幾個小時的查錯,調試,沒有發現問題的所在,只能擺脫GOOGLE了,最後在國外的一個論壇上找到了答案: this is actually a limitation of some databases which return alias all uppercase instead of using the casing you actually specified. until then use .addScalar(..) to workaround it. 原來是Hibernate對ORALCE的支持有BUG,所以修改代碼爲: Query query = getSession().createSQLQuery(sql).addScalar("ID") .addScalar("NAME").addScalar("SALARY"); 就可以了,需要注意的是 List employeeData = query.list(); 返回的employeeData 中的數據是object[],這樣取值: List employeeBean = new ArrayList(); for (int i = 0; i < employeeData.size(); i++) { Employee employee = new Employee();//把"裸"數據組裝到自己的employee類 Object[] object = (Object[]) employeeData.get(i); employee.setId(object[0].toString()); employee.setName(object[1].toString()); employee.setOrgType(object[2].toString()); employeeBean.add(employee); } OK,問題解決了! |
使用hibernate3的createSQLQuery遇到的問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.