我在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)
答案 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
不是。
您可能必须遍历查询返回的列表才能获得正确的类型(无论如何变换器在引擎盖下执行的操作)。