web-dev-qa-db-fra.com

Itération sur ResultSet et ajout de sa valeur dans une liste de tableaux

J'itère sur un ResultSet et j'essaie de copier ses valeurs dans un ArrayList. Le problème est qu'il ne traverse qu'une seule fois. Mais l'utilisation de resultset.getString("Col 1") à resultset.getString('Col n") affiche toutes les entrées de toutes les colonnes. Voici l'extrait de code -

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"));
}

La seule valeur de ResultSet à copier dans ArrayList est pour la colonne 1. Et puis pendant la fermeture. Mais je peux voir la valeur de toutes les colonnes. Pourquoi?

23
R11G

Si j'ai bien compris votre problème, il y a deux problèmes possibles ici:

  • resultset est null - Je suppose que cela ne peut pas être le cas comme si c'était une exception dans votre boucle while et rien ne serait sorti
  • le deuxième problème est que resultset.getString(i++) obtiendra les colonnes 1,2,3 et ainsi de suite à partir de chaque ligne suivante

Je pense que le deuxième point est probablement votre problème ici.

Disons que vous n'avez renvoyé qu'une seule ligne, comme suit

Col 1, Col 2, Col3 
A    ,     B,    C

Votre code tel qu'il se présente n'obtiendrait que A - il n'obtiendrait pas le reste des colonnes.

Je vous suggère de modifier votre code comme suit:

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"));
}

Modifier:

Pour obtenir le nombre de colonnes:

ResultSetMetaData metadata = resultset.getMetaData();
int numberOfColumns = metadata.getColumnCount();
27
Sean Landsman

Pour le plaisir, je propose une solution alternative utilisant jOOQ et Java 8. Au lieu d'utiliser jOOQ, vous pourriez utiliser n'importe quelle autre API qui mappe JDBC ResultSet à List, comme Spring JDBC ou Apache DbUtils , ou écrivez votre propre ResultSetIterator:

jOOQ 3,8 ou moins

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());

(Avertissement, je travaille pour l'entreprise derrière jOOQ)

11
Lukas Eder