1

私は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 関数を使用して同じクエリを実行すると、同じエラーが発生します。sum() 関数の結果を bigint または数値データ型にキャストすると、クエリはエラーなしで合計を返します。したがって、このエラーは、sum() 関数の結果を apache メタモデルでも適切なデータ型にキャストすることで解決できると思います。それで、クエリ結果をデフォルトのint型の代わりにdecimalなどの別のデータ型にキャストする方法を教えてください。

4

1 に答える 1

0

最初に、コードに関するいくつかの小さなコメント:

  • 例外の飲み込みには注意してください。少なくとも、発生した例外をログに記録する必要があります。現在、誤解を招く 0 を返すだけです。
  • integer や long などを別の方法で処理する代わりに、メソッドが Number を返すようにしてみませんか?

算術オーバーフローの問題に関しては、データベースが実際に BigDecimal を返す場合 (かなり珍しいですが、データベースは時々そのようなものです)、BigDecimal を Integer に変換するなどの質問/回答を確認する必要があります。

于 2016-07-26T21:31:41.873 に答える