【问题标题】:Does Projections.count("fieldName") always yield a Long?Projections.count("fieldName") 总是产生 Long 吗?
【发布时间】:2014-02-10 04:29:44
【问题描述】:

我正在尝试进行Hibernate Criteria 查询以从表中获取符合特定条件的行数。类似的东西

SELECT COUNT(*) FROM MyTable WHERE field1 = <numVal> and field2 = 'strVal2'

这是我的标准代码

public static int getTransactionCount(Session session, int parentID) {

        Criteria criteria = session.createCriteria(MyTable.class);

        return (Integer) criteria.add(Restrictions.eq("parentID", parentID))
                .add(Restrictions.eq("txnType", TransactionType.SOME_TYPE))
                .setProjection(Projections.count("txnID")).uniqueResult();

    }

我明白了

       Caused by: java.lang.ClassCastException: 
java.lang.Long cannot be cast to java.lang.Integer 
    at com.mydomain.MyClass.getTransactionCount(MyClass.java:123)

我的标准代码是否有问题,或者我应该总是期待很长时间才能获得计数?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    您应该使用 Long 类型。在某些具有大型数据库的情况下,符合您的条件的实体数可能超过 Integer.MAX (2147483647)。因此,返回类型为 Long.MAX,其大小为天文数字(9223372036854775807)。

    【讨论】:

      【解决方案2】:

      来自 JPA 规范说:

      函数 COUNT 的结果是一个 Long 值,表示 组中的值的数量。

      函数 AVG 的结果是一个 Double 值,表示 组的平均值。

      如果求和字段为 Long,则函数 SUM 的结果为 Long 如果字段为 Double,则为 Double

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        相关资源
        最近更新 更多