我正在迭代ResultSet
并尝试在ArrayList
中复制其值。
问题是它的遍历只有一次。但是使用resultset.getString("Col 1")
到resultset.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列。然后退出时。
但我可以看到所有列的价值。
为什么呢?
答案 0 :(得分:27)
如果我已正确理解您的问题,可能会出现两个问题:
resultset
是null
- 我认为情况就是这样,好像是你在你的while循环中得到一个异常而没有输出任何东西resultset.getString(i++)
将从每个后续行 我认为第二点可能是你的问题。
假设您只返回了1行,如下所示
Col 1, Col 2, Col3
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();
答案 1 :(得分:11)
为了好玩,我提供了使用jOOQ和Java 8的替代解决方案。您可以使用任何其他将JDBC ResultSet
映射到{{}的API,而不是使用jOOQ。 1}},例如Spring JDBC或Apache DbUtils,或编写您自己的List
:
ResultSetIterator
List<Object> list =
DSL.using(connection)
.fetch("SELECT col1, col2, col3, ...")
.stream()
.flatMap(r -> Arrays.stream(r.intoArray()))
.collect(Collectors.toList());
(免责声明,我为jOOQ背后的公司工作)