我想将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
答案 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)
答案是肯定的。
从查询中删除SUM,ROUND和GROUP BY子句。
在迭代结果集时,创建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...
}
有一个方法可以获取你的地图并计算任何......
答案 2 :(得分:0)
也是一个不回答。聚合等等在数据库中做得更好,因为发生的来回沟通较少,将数据库编号编组到java对象和其他开销。
您应该将数据库中的字段定义为DECIMALS(...,2),而不是DOUBLE。这是最重要的理智措施。当您使用BigDecimal时,您可能已经拥有相同的声音数据库设计,但多余的(?)舍入让我写下了这个答案。