1

我想将ResultSet值传输到 HashMap 然后添加它们,所以我最初做了这个代码:

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();
        }

是否可以使用hashmap通过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 中是否已存在键。如果没有,则将新键及其值添加到 Map;如果是,则获取现有值,将当前 ResultSet 值添加到其中,并将结果放回该键的 Map 中。

于 2012-04-24T09:18:17.100 回答
0

答案是肯定的。

  1. 从查询中删除 SUM、ROUND 和 GROUP BY 子句。

  2. 当您迭代结果集时,创建 MUCS_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 回答
0

也是不答。聚合等最好在数据库中完成,因为更少的来回通信发生,将数据库编号编组到 java 对象和其他开销。

例如,您应该将数据库中的字段定义为 DECIMALS(..., 2) 而不是 DOUBLE。这是最重要的理智衡量标准。当您使用 BigDecimal 时,您可能已经拥有相同的合理数据库设计,但是多余的(?)舍入让我写了这个答案。

于 2012-04-24T09:28:37.547 回答