环境:有一张试题库表...表中有很多字段,其中有type字段,记录各种题型。
需求:现要从这张表中查出各种题型的个数。
在sql工具中写sql语句都没有任何问题,但用hibernate来写,要怎么读出这个查询到的值,我还是试了很多方法,不管用sql或者hql的方式,我都获取这些值失败了。
尝试过新建一个类来封装查询得到的值。但是在用hibernate 中,它的返回结果无一例外都是返回的当前查询类,或者不指定返回泛型类型(但那样就拿不到查询结果里面的一对值)。
hibernate中不支持返回与查询当前类不同的类。否则会报出MappingException
;若在返回list之前强行指定返回类型,也会出异常(造型异常)
最后想到了最原始的方法,让它返回Object 对象数组:
如下
public List<Object []> selectSumType() {
return getSession().createSQLQuery("select type, count(*) from test group by type").list();
}
这里写sql 或者hql都没有问题。
最后获取相应的值。在获取值的时候需要注意,字段获得的值的类型跟类中对应的属性类型匹配:如 type字段查出的类型跟javaBean中type属性对应的Integer一致 。而聚合函数得到的值的类型是个数字;在测试发现,聚合函数返回的类型是Long类型,不是Integer类型。
如果需要变成Integer,则稍加转换下:Integer.parseInt(Long.toString())
以下摘自这里
对于返回是Integer还是Long?我是采用的Hibernate 3.2版本,这个版本已经把以前返回 Integer的改成了 Long
因为JPA里面的返回值规定是Long, Hibernate为了兼容这个,所以修改了返回值。
如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。
这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。