在尝试获取大量数字数据的总和时,Apache元模型会抛出异常

时间:2016-07-08 13:38:38

标签: java apache-metamodel

我是apache元模型的新手。我使用它来使用以下代码获取数据库表中任何数字列的总和:

        Object object = null;
        long sum = 0;
        String columnName = table.getColumn(iColumnNumber).getName();
        Query query = dataContext.query().from(table).select(FunctionType.SUM, table.getColumnByName(sColumnName)).toQuery();
        org.eobjects.metamodel.data.DataSet ds = dataContext.executeQuery(query);
        try {
            ds.next();
            org.eobjects.metamodel.data.Row row = ds.getRow();
            try {
                object = row.getValue(0);
            } catch (Exception ex) {
                return 0;
            }
            if (object instanceof java.lang.Long) {
                sum = (long) object;
            } else if (object instanceof BigDecimal) {
                sum = ((BigDecimal) object).longValue();
            } else if (object instanceof java.lang.Integer) {
                sum = ((java.lang.Integer) object).longValue();
            }

        } catch (Exception ex) {
            return 0;
        } finally {
            if (ds != null) {
                ds.close();
            }
        }

该代码适用于小数据,但是当我为包含数十万行的非常大的数据尝试相同的代码时。代码抛出异常: 无法在结果集中获取下一条记录:将表达式转换为数据类型int的算术溢出错误。

当我在dbms脚本窗口中直接使用数据库表上的sum函数运行相同的查询时,我得到相同的错误。如果我在bigint或numeric数据类型中转换sum()函数的结果,则查询返回总和而不给出任何错误。因此,我认为可以通过在apache元模型中以适当的数据类型转换sum()函数的结果来解决此错误。所以任何人都可以让我知道如何将查询结果转换为另一种数据类型,如十进制而不是默认类型int。

1 个答案:

答案 0 :(得分:0)

首先对您的代码进行一些小的评论:

  • 小心吞咽异常。您应该至少记录发生的异常 - 现在您只返回0,这会产生误导。
  • 不是以不同方式处理整数,长整数等,为什么不让你的方法返回Number?

关于算术溢出问题,如果你的数据库确实返回BigDecimal(非常不寻常,但数据库有时候就是这样),那么你应该看看问题/答案,例如Converting BigDecimal to Integer