web-dev-qa-db-ja.com

ResultSetを反復処理し、その値をArrayListに追加する

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のみです。その後、終了します。しかし、私はすべての列の値を見ることができます。どうして?

23
R11G

あなたの問題を正しく理解している場合、ここには2つの問題が考えられます。

  • resultset is null-whileループで例外が発生し、何も出力されないかのように、これは当てはまらないと思います
  • 2番目の問題は、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();
27
Sean Landsman

楽しみのために、 jOOQ とJava 8.を使用する代わりに、jOOQを使用する代わりのソリューションを提供しています。 JDBC ResultSetListにマップする他のAPIを使用できます。たとえば、 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の背後にある会社で働いています)

11
Lukas Eder