26

を反復処理し、ResultSetその値を にコピーしようとしていますArrayList。問題は、そのトラバースが 1 回だけであることです。ただし、 to を使用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 です。そして、while が終了します。しかし、すべての列の値を見ることができます。なんで?

4

2 に答える 2

33

私が問題を正しく理解していれば、次の 2 つの問題が考えられます。

  • resultsetis null- whileループで例外が発生し、何も出力されないかのように、これは当てはまらないと思います。
  • 2 番目の問題は、後続の各行resultset.getString(i++)から列 1、2、3 などを取得することです。

2番目の点はおそらくここでの問題だと思います。

次のように、1 行だけが返されたとします。

Col 1, Col 2, Col 3 
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();
于 2013-03-20T09:00:06.900 に答える
11

楽しみのために、 jOOQと Java 8を使用した代替ソリューションを提供します。jOOQ を使用する代わりに、 Spring JDBCApache DbUtilsなど、 JDBCResultSetをにマップする他の A​​PI を使用することも、独自の を作成することもできます。ListResultSetIterator

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の背後にある会社で働いています)

于 2014-09-23T13:43:59.460 に答える