Hibernate 中使用聚合函数

环境:有一张试题库表...表中有很多字段,其中有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的最新文档中找到说明。

    原文作者:mugbya
    原文地址: https://segmentfault.com/a/1190000000500818
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞