将ResultSet值传输到HashMap,然后添加它们

时间:2012-04-24 09:11:50

标签: java hashmap resultset

我想将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

3 个答案:

答案 0 :(得分:0)

当然,您可以这样做 - 您可以在数据库上执行的任何操作也可以在中间层上完成。我要问的问题是:哪一个更适合这种计算?如果查询带回了大量数据,我会说让数据库服务器完成工作会更好。将大型数据集移动到中间层只是为了添加和舍入是没有意义的。

我的直觉是数据库非常适合这种计算。我认为没有理由不允许它这样做。

但是,如果你必须,这就是它的样子:

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中。

答案 1 :(得分:0)

答案是肯定的。

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

  2. 在迭代结果集时,创建MCUS_Exam对象并将它们添加到您的hashmap中:

    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. 有一个方法可以获取你的地图并计算任何......

答案 2 :(得分:0)

也是一个不回答。聚合等等在数据库中做得更好,因为发生的来回沟通较少,将数据库编号编组到java对象和其他开销。

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