ResultSet
を反復処理し、その値をArrayList
にコピーしようとしています。問題は、その移動が1回だけであることです。ただし、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のみです。その後、終了します。しかし、私はすべての列の値を見ることができます。どうして?
あなたの問題を正しく理解している場合、ここには2つの問題が考えられます。
resultset
is null
-whileループで例外が発生し、何も出力されないかのように、これは当てはまらないと思いますresultset.getString(i++)
が後続の各行から列1、2、3などを取得することです。2番目のポイントはおそらくここにあるあなたの問題だと思います。
次のように、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();
楽しみのために、 jOOQ とJava 8.を使用する代わりに、jOOQを使用する代わりのソリューションを提供しています。 JDBC ResultSet
をList
にマップする他のAPIを使用できます。たとえば、 Spring JDBC または Apache DbUtils 、または独自のResultSetIterator
を記述する:
List<Object> list =
DSL.using(connection)
.fetch("SELECT col1, col2, col3, ...")
.stream()
.flatMap(r -> Arrays.stream(r.intoArray()))
.collect(Collectors.toList());
List<Object> list =
DSL.using(connection)
.fetch("SELECT col1, col2, col3, ...")
.stream()
.flatMap(Record::intoStream)
.collect(Collectors.toList());
(免責事項、私はjOOQの背後にある会社で働いています)