JAVA 使用hibernate3的createSQLQuery遇到的問題


使用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,問題解決了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章