1

値を HashMapに転送してから追加したいResultSetので、最初に次のコードを実行しました。

PreparedStatement pstmt=null;       
ResultSet rs = null; 
String query="SELECT record_id, SUM(ROUND(amtsourcedr, 2)) AS debit, SUM(ROUND(amtsourcecr, 2)) AS credit " +
                "FROM adempiere.fact_acct " +
                "GROUP BY record_id " +
                "ORDER BY record_id ASC";

    try
    {

        pstmt = DB.prepareStatement(query, null);
        rs = pstmt.executeQuery();

        while (rs.next())
        {

            int id = rs.getInt("record_id");
            BigDecimal sourceDr = rs.getBigDecimal("debit");
            BigDecimal sourceCr = rs.getBigDecimal("credit");
            System.out.println(id);
            System.out.println(sourceDr);
            System.out.println(sourceCr);

            MCUS_Exam exam = new MCUS_Exam(getCtx(), 0, null);
            exam.setCUS_Record_ID(id);
            exam.setCUS_AmtSourceDr(sourceDr);
            exam.setCUS_AmtSourceCr(sourceCr);
            exam.save();
        }

ハッシュマップを使用してJavaを介してクエリで見つかった加算と丸めを行うことは可能ですか? はいの場合、どうすればそれを行うことができますか?

編集: GROUP BY は、実際には Java で複製するのに苦労しているものです。

以下は元の表です。

    record_id    amountdr       amountcr
    1000000        0            213.7544
    1000000        0            270.00
    1000000      483.7544          0
    1000001        0            2250.6677
    1000001        0            400.5050
    1000001        0            12867.75
    1000001      15518.9327        0
    1000002        0            27000.6543
    1000002      27000.6543        0

そして、私が与えたコードを実行すると、これが別のテーブルに追加されます:

    record_id    amountdr       amountcr
    1000000      483.75         483.75   
    1000001      15518.92       15518.93
    1000002      27000.65       27000.65
4

3 に答える 3

1

もちろん、実行できます。データベースで実行できることはすべて、中間層でも実行できます。ここで質問したいのは、この計算に適した選択はどれかということです。クエリで大量のデータが返される場合は、データベース サーバーに処理を任せたほうがよいでしょう。大規模なデータ セットを単純に中間層に移動して加算および丸めを行うことにはほとんど意味がありません。

私の本能は、データベースがこの計算に適しているということです。許可してはいけない理由が見当たりません。

ただし、必要に応じて、次のようになります。

Map<String, Double> rs = new HashMap<String, Double>();
// How will you duplicate the GROUP BY?
double sum = 0.0;
for (String key : rs.keySet()) {
    sum += rs.get(key);
}
// Rounding is a display issue; I'd do it elsewhere

考えてみると、Map はすでに GROUP BY を実行しています。キーは一意でなければなりません。ResultSet から Map にマッピングするときは、キーが Map に既に存在するかどうかを確認する必要があります。そうでない場合は、新しいキーをその値とともにマップに追加します。存在する場合は、既存の値を取得し、現在の ResultSet 値をそれに追加して、結果をそのキーのマップに戻します。

于 2012-04-24T09:18:17.100 に答える
0

こちらも無回答。データベース番号を Java オブジェクトにマーシャリングし、その他のオーバーヘッドが発生することが少なくなるため、集計などはデータベースでより適切に実行されます。

たとえば、データベース内のフィールドを DOUBLE ではなく DECIMALS(..., 2) として定義する必要があります。それが最も重要な健全性対策です。BigDecimal を使用しているため、おそらく同じデータベース設計が既にあると思われますが、その余分な (?) 丸めにより、この回答を書きました。

于 2012-04-24T09:28:37.547 に答える
0

答えはイエスです。

  1. クエリから SUM、ROUND、および GROUP BY 句を削除します。

  2. 結果セットを反復処理するときに、MCUS_Exam オブジェクトを作成し、ハッシュマップに追加します。

    Map<Integer, MCUS_Exam> map = new HashMap<Integer, MCUS_Exam>();
    while (rs.next()) {
       // code here
       MCUS_Exam exam = new MCUS_Exam(getCtx(), 0, null);   
       map.put(id, exam);
       // perhaps some more code here...
    }
  3. マップを取得して何でも計算するメソッドを用意してください...

于 2012-04-24T09:18:47.280 に答える