私は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などの別のデータ型にキャストする方法を教えてください。