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

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

是否可以通过java使用hashmap来对查询中找到的结果进行加法和舍入?如果是,那么我该如何继续做呢?

编辑: 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

最佳答案

您当然可以做到 - 您可以在数据库上执行的任何操作也可以在中间层上完成。我要问的问题是:对于此计算,哪一个是更好的选择?如果查询返回大量数据,我认为最好让数据库服务器来完成这项工作。仅仅为了添加和舍入而将大型数据集移动到中间层没有什么意义。

我的直觉是数据库非常适合这种计算。我看不出您有任何理由不允许它这样做。

但是,如果您必须的话,它可能如下所示:

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

关于java - 将 ResultSet 值传输到 HashMap 然后添加它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294972/

相关文章:

java - 方法不能应用于 java.lang.Object(应该接受特定类的对象作为参数)

java - OkHttp spdy 支持吗?响应.协议(protocol)()

java - 如何返回 Hashmap 中特定值的键?

android - arraylist<hashmap<string,string>> 不工作

java - 测试 ResultSet 以查看它是否包含列标签

java - Hibernate : How to get Named SQL Query resultset as List<Map<columnName, Value> 而不是 List<Object[]>

java - 为什么快速平方根反比在 Java 上如此奇怪和缓慢?

java - 在 Spring 应用程序中禁用 JMX

java - 如何获取HashMap中被覆盖的键值

java - 使用 wasnull() 处理 java 结果集中的 null