【问题标题】:Iterate through dynamic Result Set遍历动态结果集
【发布时间】:2017-10-23 01:53:33
【问题描述】:

我的查询可以从表中返回动态列数。我需要遍历每一列并存储该特定列的所有行的数据并将它们存储在一个列表中。我需要对查询返回的所有列执行此操作。 同样,查询可以返回动态列。 以最少的代码复杂性实现上述场景的最佳方法是什么。 例如:

------------------
Employee Table
------------------
Name | Age | Roll
------------------
A    | 21  | 1
------------------
B    | 22  | 2

我需要首先遍历 Name 列并将 Name 存储为键,并将 A 和 B 作为该映射的值,然后遍历 Age 列并将 Age 作为键,将 21,22 作为该键的值,依此类推.. .

我想以最简单的方式实现这一目标。

这是我开发的代码:

rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();

for (int j = 1; j <= columnsNumber; j++)
                {
                    String Colkey = rsmd.getColumnName(j);
                    List<String> colValueList = new ArrayList<String>();
                    while (rs.next())
                    {
                        colValueList.add(rs.getString(Colkey));


                    }

                    rs = pstmt.executeQuery();
                    map.put(Colkey,colValueList);
                }

提前谢谢你。

【问题讨论】:

  • 你试过自己做吗?包含有问题的代码
  • Map&lt;Sting, List&lt;String&gt;&gt;,第一个字符串是列名,``List`保存了列的信息
  • 我想为具有大量数据的表实现此功能。所以我对复杂性感到困扰。
  • @ Lukasz_Plawny - 请找到添加的代码。
  • 循环应该被交换。外部循环使用rs.next(),但内部循环遍历列。使用MultiValueMapMap&lt;String, List&lt;String&gt;&gt; 为列名添加值

标签: java list hashmap iteration resultset


【解决方案1】:

这是一种方法:

rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();

for (int j = 1; j <= columnsNumber; j++) {
    String Colkey = rsmd.getColumnName(j);
    map.put(Colkey, new ArrayList<String>());
}
while (rs.next()) {
    for (Map.Entry<String,List<String>> e: map.entrySet) {
        String Colkey = e.getKey();
        List<String> list = e.getValue();
        list.add(rs.getString(Colkey));
    }
}

【讨论】:

  • 谢谢你。当我实现上述逻辑时,所用时间为 41574 毫秒,而 211310 毫秒。这在一定程度上满足了复杂性的需要。不过,我希望我能得到一些更简单的东西。
【解决方案2】:

这很简单。 存储到地图值时请遵循 POJO 概念。 1.首先获取表逻辑结构并创建Pojo类,如下所示:-

    public class Employee {

    String name;
    int age;
    int roll;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getRoll() {
        return roll;
    }

    public void setRoll(int roll) {
        this.roll = roll;
    }
}

现在是在 HashMap 中插入的逻辑。

rs = pstmt.executeQuery();
    HashMap map=new HashMap<String,Employee>();
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnsNumber = rsmd.getColumnCount();

    for (int j = 1; j <= columnsNumber; j++)
                    {
                        String Colkey = rsmd.getColumnName(j);
                        List<String> colValueList = new ArrayList<String>();
                        while (rs.next())
                        {
                           Employee emp=new Employee();
                           emp.setAge(rs.getInt("AGE"));
                           emp.setAge(rs.getInt("ROLL"));
                           emp.setName(rs.getString("NAME"));
                         map.put(emp.getName(), emp);
                        }

                        rs = pstmt.executeQuery();
                  }

【讨论】:

  • 这是否适用于动态列数,同时牢记代码复杂性?
猜你喜欢
  • 2011-11-30
  • 2019-02-18
  • 2020-07-12
  • 2014-09-30
  • 2012-06-05
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多