java - 使用 Java Collections/Map 以编程方式执行 SQL 查询

标签 java sql collections hashmap

我有 2 个具有相同 stringColum 的表,如下所示:

表 A(完整):

stringColum       doubleColumn
name a            1
name a            2
name b            5
name b            4
name b            1
name c            2
[...]

表 B(表 A 中的 stringColum 中可能存在一些缺失值):

stringColum       doubleColumn
name b            10
name b            20
name b            30
name c            11
[...]

如何获得一个对象,其值按 doubleColumn 求和并按 stringColum 分组,如下所示(我的意思是,对表 A 和 B 执行此操作,以便我可以在此之后比较它们)?

表 A(汇总/分组):

stringColum       doubleColumn
name a            3
name b            10
name c            2
[...]

表 B(汇总/分组):

stringColum       doubleColumn
name b            60
name c            11
[...]

除了使用 SQL/JPQL 执行数据库联接/分组之外,我如何使用下面开始的集合来执行此操作?

List<UorPos> uorsList = uf.findAllUPB();
List<Treinamentos> treinamentosList = tf.findAll();

Map<String, Double> orcMap = new HashMap<>();
Map<String, Double> rlzMap = new HashMap<>();

for (UorPos u : uorsList) {
    orcMap.put(u.getNomeUorPos(), u.getOrc());
}

for (Treinamentos r : treinamentosList) {
    rlzMap.put(r.getDivisao(), r.getValorCurso());
}

上面的 for 循环仅从表中获取第一对寄存器。例如。: for循环后的TableA resultList(类似于TableB resultList):

stringColum       doubleColumn
name a            1
name b            5
name c            2
[...]

如何获取所有值,然后将它们相加,并按 stringColumn 分组?

之后,我需要比较两个表中存在的 stringColumn,用“missingString Column”、“0”对填充表 B。例如:

表 B(汇总/分组):

stringColum       doubleColumn
name a            0 // --> this pair of register will be inserted in TableB if a stringColum present in TableA doesn't exist in the Table B
name b            60
name c            11
[...]

提前致谢!

最佳答案

要进行分组和求和,请使用以下代码:

    for (UorPos u : uorsList) {
        orcMap.merge(u.getNomeUorPos(), u.getOrc(), (x, y) -> x + y);
    }

    for (Treinamentos r : treinamentosList) {
        rlzMap.merge(r.getDivisao(), r.getValorCurso(), (x, y) -> x + y);
    }

或者如果您不使用 Java 8:

    for (UorPos u : uorsList) {
        String key = u.getNomeUorPos();
        if (orcMap.containsKey(key)) {
            orcMap.put(key, orcMap.get(key) + u.getOrc());
        } else {
            orcMap.put(key, u.getOrc());
        }
    }

    for (Treinamentos r : treinamentosList) {
        String key = r.getDivisao();
        if (rlzMap.containsKey(key)) {
            rlzMap.put(key, rlzMap.get(key) + r.getValorCurso());
        } else {
            rlzMap.put(key, r.getValorCurso());
        }
    }

要将缺少的项目添加到第二张 map ,请使用以下代码:

    for (String key : orcMap.keySet()) {
        rlzMap.putIfAbsent(key, 0.0);
    }

或者如果您不使用 Java 8:

    for (String key : orcMap.keySet()) {
        if (!rlzMap.containsKey(key)) {
            rlzMap.put(key, 0.0);
        }
    }

关于java - 使用 Java Collections/Map 以编程方式执行 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28810730/

相关文章:

java - ... 上不存在 'Access-Control-Allow-Origin' header 。因此不允许访问 Origin 'null'

java - 使用方法引用和原始类型的函数接口(interface)特化的重载解析

sql - 同一事务的两个语句与单个语句的隔离级别

php - SQL 计数返回 0

具有通用版本 8 和 17 的 Java 实例类型

java - 迭代存储在 ArrayList 中的 HashMap 中的值

java - 如何用xpath解析html?

mysql - 如何获取该行中某一列的值在该表中出现超过100次的行

algorithm - 有效维护 list

java - 在调用 getSingleResult() 方法时出现 java.lang.ClassCastException?