1

我在休眠中使用本机查询,它会返回我的 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) 
4

3 回答 3

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;
}

我正在使用休眠 4.3

于 2015-08-25T14:30:34.457 回答
2

这个问题很简单。首先,如果你使用原生SQL,返回的结果集是对象数组,每个数组的第一个元素是你的id值,所以方法的return-value应该是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
}
于 2013-03-23T03:26:59.457 回答
0

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

您可能必须遍历查询返回的列表才能获得正确的类型(无论如何,这都是转换器在幕后所做的)。

于 2013-03-22T15:05:30.703 回答