26

我正在迭代 anResultSet并尝试将其值复制到ArrayList. 问题是它只遍历一次。但使用resultset.getString("Col 1")toresultset.getString('Col n")显示所有列的所有条目。以下是代码片段 -

ResultSet resultset = null;
ArrayList<String> arrayList = new ArrayList<String>(); 
int i = 1;
while (resultset.next()) {              
    arrayList.add(resultset.getString(i++));
    System.out.println(resultset.getString("Col 1"));
    System.out.println(resultset.getString("Col 2"));
    System.out.println(resultset.getString("Col n"));
}

ResultSet被复制到的唯一值ArrayList是第 1 列。然后退出。但我可以看到所有列的值。为什么?

4

2 回答 2

33

如果我正确理解了您的问题,这里可能存在两个问题:

  • resultsetnull- 我认为这不可能是这样的情况,就好像你会在你的 while 循环中得到一个异常并且什么都不会输出。
  • 第二个问题是resultset.getString(i++)将从每个后续行中获取第 1、2、3 列等。

我认为第二点可能是您的问题。

假设您只返回了 1 行,如下所示:

Col 1, Col 2, Col 3 
A    ,     B,     C

你的代码只会得到 A - 它不会得到其余的列。

我建议您更改代码如下:

ResultSet resultset = ...;
ArrayList<String> arrayList = new ArrayList<String>(); 
while (resultset.next()) {                      
    int i = 1;
    while(i <= numberOfColumns) {
        arrayList.add(resultset.getString(i++));
    }
    System.out.println(resultset.getString("Col 1"));
    System.out.println(resultset.getString("Col 2"));
    System.out.println(resultset.getString("Col 3"));                    
    System.out.println(resultset.getString("Col n"));
}

编辑:

要获取列数:

ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();
于 2013-03-20T09:00:06.900 回答
11

只是为了好玩,我提供了一个使用jOOQ和 Java 8 的替代解决方案。除了使用 jOOQ,您可以使用任何其他将 JDBC 映射ResultSet到的API List,例如Spring JDBCApache DbUtils,或者编写自己的ResultSetIterator

jOOQ 3.8 或更低

List<Object> list =
DSL.using(connection)
   .fetch("SELECT col1, col2, col3, ...")
   .stream()
   .flatMap(r -> Arrays.stream(r.intoArray()))
   .collect(Collectors.toList());

jOOQ 3.9

List<Object> list =
DSL.using(connection)
   .fetch("SELECT col1, col2, col3, ...")
   .stream()
   .flatMap(Record::intoStream)
   .collect(Collectors.toList());

(免责声明,我在 jOOQ 背后的公司工作)

于 2014-09-23T13:43:59.460 回答