Итерирование по ResultSet и добавление его значения в ArrayList
Я повторяю ResultSet
и пытаюсь скопировать его значения в ArrayList
.
Проблема в том, что его обход только один раз. Но использование resultset.getString("Col 1")
to 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. И затем во время выхода.
Но я вижу значение всех столбцов.
Почему?
Ответы
Ответ 1
Если я правильно понял вашу проблему, здесь есть две возможные проблемы:
-
resultset
- null
- Я предполагаю, что это не так, как если бы вы получали исключение в своем цикле while и ничего не выводили
- Вторая проблема заключается в том, что
resultset.getString(i++)
получит столбцы 1,2,3 и так далее от каждой следующей строки
Я думаю, что второй вопрос, вероятно, ваша проблема здесь.
Предположим, что вы вернули только 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"));
}
Edit:
Чтобы получить количество столбцов:
ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();
Ответ 2
Просто для удовольствия, я предлагаю альтернативное решение, используя jOOQ и Java 8. Вместо использования jOOQ вы могли бы используя любой другой API, который отображает JDBC ResultSet
в List
, например Spring JDBC или Apache 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)