Итерирование по ResultSet и добавление его значения в ArrayList - программирование
Подтвердить что ты не робот

Итерирование по 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. И затем во время выхода. Но я вижу значение всех столбцов. Почему?

4b9b3361

Ответ 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)