Я собираюсь пойти с интерпретацией Илии, которую Нимеш на самом деле имел в виду: «Можно ли сделать обертку итеративной для ResultSet. Идея. Так как нет стандартного (насколько я знаю) ResultSetRow, он возвращает Object [] для каждой строки.
Существуют некоторые существенные проблемы с этой концепцией, не в последнюю очередь то, что Iterator не разрешается генерировать, поэтому исключения SQLE обрабатываются как можно лучше «на месте». Кроме того, ResultSet - очень сложный и многофункциональный зверь (см. Например перегруженные методы для каждого типа). Эту сложность можно частично использовать в своих интересах, но это не так. Например, могут быть такие методы, как getIntIterable(ResultSet rs)
, который возвращает Iterable<int[]>
. Метод может проверить getColumnType
s объекта ResultSetMetadata. Таким образом, он может генерировать (если, например, не все столбцы являются целыми) перед созданием Iterable, методы которого не могут генерировать.
public static class ResultSetIterable implements Iterable<Object[]>
{
private ResultSet rs;
private int columnCount;
public ResultSetIterable(ResultSet rs) throws SQLException
{
this.rs = rs;
columnCount = rs.getMetaData().getColumnCount();
}
public Iterator<Object[]> iterator()
{
return new Iterator<Object[]>()
{
private boolean moreRows;
{
try
{
moreRows = rs.first();
}
catch(SQLException e)
{
moreRows = false;
}
}
public boolean hasNext()
{
boolean knownClosed = false;
try
{
knownClosed = rs.isClosed();
}
catch(Throwable e)
{
// Ignore possible SQLException or AbstractMethodError or...
}
return !knownClosed && moreRows;
}
public Object[] next()
{
Object[] curRow = new Object[columnCount];
for(int i = 1; i <= columnCount; i++)
{
try
{
curRow[i - 1] = rs.getObject(i);
}
catch(SQLException e)
{
curRow[i - 1] = null;
}
}
try
{
moreRows = rs.next();
}
catch(SQLException e)
{
moreRows = false;
}
return curRow;
}
public void remove()
{
try
{
rs.previous();
rs.deleteRow();
}
catch(SQLException e)
{
throw new UnsupportedOperationException("ResultSetIterable does not support remove for this ResultSet type.");
}
}
};
}
}