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

Je répète un ResultSet et tente de copier ses valeurs dans une ArrayList . Le problème est que sa traversée une seule fois. Mais utiliser resultset.getSsortingng("Col 1") pour resultset.getSsortingng('Col n") affiche toutes les entrées de toutes les colonnes.

 ResultSet resultset = null; ArrayList arrayList = new ArrayList(); int i = 1; while (resultset.next()) { arrayList.add(resultset.getSsortingng(i++)); System.out.println(resultset.getSsortingng("Col 1")); System.out.println(resultset.getSsortingng("Col 2")); System.out.println(resultset.getSsortingng("Col n")); } 

La seule valeur de ResultSet qui est copiée dans ArrayList est la colonne 1. Et ensuite, pendant la sortie. Mais je peux voir la valeur de toutes les colonnes. Pourquoi?

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 vous obteniez une exception dans votre boucle while et que rien ne serait sorti
  • le second problème est que resultset.getSsortingng(i++) obtiendra les colonnes 1,2,3 et ainsi de suite de chaque ligne suivante

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

Disons que vous aviez seulement une ligne retournée, comme suit

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

Votre code, dans sa version actuelle, ne contiendrait que A – il ne contiendrait pas le rest des colonnes.

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

 ResultSet resultset = ...; ArrayList arrayList = new ArrayList(); 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(); 

Juste pour le plaisir, je vous propose une solution alternative utilisant jOOQ et Java 8. Au lieu d’utiliser jOOQ, vous pouvez utiliser toute autre API mappant JDBC ResultSet sur List , comme Spring JDBC ou Apache DbUtils , ou écrivant votre propre ResultSetIterator :

jOOQ 3.8 ou moins

 List list = DSL.using(connection) .fetch("SELECT col1, col2, col3, ...") .stream() .flatMap(r -> Arrays.stream(r.intoArray())) .collect(Collectors.toList()); 

jOOQ 3.9

 List list = DSL.using(connection) .fetch("SELECT col1, col2, col3, ...") .stream() .flatMap(Record::intoStream) .collect(Collectors.toList()); 

(Disclaimer, je travaille pour l’entreprise derrière jOOQ)