Hibernate本机查询返回整数列表不起作用

时间:2013-03-22 14:09:37

标签: hibernate native

我在hibernate中使用本机查询,它将返回我的id列表。我想将此列表转换为整数列表。但它不起作用,并向我展示例外情况。

public List<Integer> fethcSurvayIdOnCount(){
            HibernateCallback action = new HibernateCallback() {
            public Object doInHibernate(Session session)
            throws HibernateException, SQLException {
        String hq = "select id from tb_abc where age='10'" ;

        SQLQuery query = (SQLQuery) session
                .createSQLQuery(hq)
                .setResultTransformer(
                        Transformers
                                .aliasToBean(Integer.class));

        return query.list();
    }
    };
    return (List<Integer>) getHibernateTemplate()
        .execute(action);
    }   

这是例外

org.springframework.orm.hibernate3.HibernateSystemException: Could not find setter for id on class java.lang.Integer; nested exception is org.hibernate.PropertyNotFoundException: Could not find setter for id on class java.lang.Integer
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339) 

3 个答案:

答案 0 :(得分:3)

这样更好。循环中不需要从Object转换为Integer:

public List<Integer> getIds(){ 

    String hq = "select id from tb_abc where age='10'" ;
    List<Integer> results = session.createSQLQuery(hq).list();

    return results;
}

我正在使用hibernate 4.3

答案 1 :(得分:2)

这个问题非常简单。首先,如果你使用本机SQL,返回的结果集是对象数组,每个数组中的第一个元素是你的id值,所以方法的返回值应该是List,这是一个例子:

public List<Object[]> getIds(){ 

    String hq = "select id from tb_abc where age='10'" ;
    List<Object[]> results = session.createSQLQuery(hq).list();

    return results;

}

获得结果后,您可以获得以下预期值:

for(Object[] obj : results) {
     Integer id = Integer.valueOf(obj[0].toString());
     // do sth
}

答案 2 :(得分:0)

问题来自您的Transfomer。当您从列表中获取特定字段时,方法是List<Object[]>并且您变换器尝试将这些对象映射到整数但是基于属性的别名(在您的情况下为“id”)并假设你指定的类是一个bean(因此aliasToBean的名称)Integer不是。

您可能必须遍历查询返回的列表才能获得正确的类型(无论如何变换器在引擎盖下执行的操作)。

相关问题