Сохраняйте каждую строку в наборе результатов как объект в массиве

По сути, моя проблема заключается в том, что я возвращаю набор результатов из запроса jdbc и хочу сохранить каждую строку как объект в массиве. когда я пытаюсь перебрать набор результатов - он сохраняет только объект в массиве - я полагаю, это, очевидно, связано с тем, что цикл while находится внутри цикла for - я пытался несколько раз перенастроить циклы, но с нет радости. Было бы здорово найти менее сложный и запутанный способ передачи объектов в массив.

    ResultSet rs = st.executeQuery(query);
    Check c = new Check();
    rs.last();
    int numberOfRows = rs.getRow(); 
    Check checkArray [] = new Check [numberOfRows]; 
    rs.beforeFirst();

    for (int i = 0; i < checkArray.length; i++)
    {
     while (rs.next())
     {
    c.setAmount(rs.getBigDecimal("AMOUNT"));
    c.setCheckNumber(rs.getString("CHECKNUMBER"));
    c.setComments(rs.getString("COMMENTS"));
    c.setId(rs.getLong("SETID"));
    c.setMailTo(rs.getString("MAILTO"));
    c.setPayTo(rs.getString("PAYTO"));
    c.setProcessed(rs.getBoolean("PROCESSED"));
    checkArray[i]= c;
}
}

person petey    schedule 25.02.2012    source источник
comment
Я думаю, что было бы немного проще использовать arrayList, но, к сожалению, я должен возвращать массив типа проверки.   -  person petey    schedule 25.02.2012


Ответы (3)


Попробуйте комбинировать петли:

ResultSet rs = st.executeQuery(query);
rs.last();
int numberOfRows = rs.getRow(); 
Check checkArray [] = new Check [numberOfRows]; 
rs.beforeFirst();

while (numberOfRows > 0 && rs.next()) {
    Check c = new Check();
    c.setAmount(rs.getBigDecimal("AMOUNT"));
    c.setCheckNumber(rs.getString("CHECKNUMBER"));
    ...
    checkArray[i]= c;
    numberOfRows--;
}
person nowbumja    schedule 25.02.2012

ResultSetимеет функцию getArray, поэтому вы можете использовать ее так.

    checkArray[i]= rs.getArray(int columnIndex);
person Mujtaba Alboori    schedule 25.02.2012
comment
не могу продлить Проверить, к сожалению - person petey; 25.02.2012
comment
его строки, из которых я делаю объекты, а не массивы - person petey; 25.02.2012

Если ваш ResultSet не является экземпляром CachedRowSet, он не будет знать, сколько там строк, и вернет ноль из .getRow().

Основная проблема с вашим кодом заключается в том, что вы повторно используете один и тот же экземпляр Check снова и снова, что означает, что все элементы вашего массива являются одними и теми же Check. объект. Вам нужно создать новый экземпляр для каждой строки

Лучше загрузить все строки в List и использовать while (resultSet.next()) для управления циклом.

Если вам абсолютно необходим массив, преобразуйте список в массив в конце с помощью List.toArray()

Сокращенная версия кода:

List<Check> list = new ArrayList<Check>();

while (rs.next()) {
    Check c = new Check();
    // set fields of c
    list.add(c);
}

Check[] checkArray = list.toArray();
person Bohemian♦    schedule 25.02.2012
comment
Пожалуйста, скажите мне, что есть класс-независимый способ сделать это. Необходимость писать строки кода для каждого из свойств ужасна. - person joelc; 24.05.2014
comment
@haxor что ты имеешь в виду? способ сделать что именно? - person Bohemian♦; 24.05.2014
comment
Цикл while (rs.next()) — вам нужно перебрать каждого члена класса, который вы хотите сохранить. Я надеялся, что есть способ выгрузить ResultSet непосредственно в List‹Object›, которым потом можно было бы управлять с помощью Reflection. - person joelc; 24.05.2014