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?
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 sortiresultset.getString(i++)
obtiendra les colonnes 1,2,3 et ainsi de suite à partir de chaque ligne suivanteJe 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();
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
:
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());
(Avertissement, je travaille pour l'entreprise derrière jOOQ)