Foro sobre Java SE > Imprimir contenido de un resultsetcollection
Sin código no es posible saber qué es lo que estás haciendo.
Es fácil llenar un Map con el contenido de las filas de un ResultSet. Parece que lo tienes resuelto, por lo que dices.
¿El problema es recorrer un Map, u obtener su contenido?
Tienes razon, como decía anteriormente utilizo un objeto ResultSetCollection enmascarado en un map, el código a continuación, carga los datos de una consulta SQL sobre Postgres,
la variable sql es un string que mantiene una sentencia tipo select * from mi tabla;
PreparedStatement stmt = this.getConnection().prepareStatement(sql);
ResultSet res = stmt.executeQuery();
ResultSetCollection collection = new ResultSetCollection(res,regs);
beans.put("DATA",collection);
Utilizo el hashMap beans en otra función en la que básicamente necesito recuperar los datos de la consulta inicial, haciendo algo parecido a lo siguiente
Map beans = new HashMap<>();
beans = model.getHashmodel();
Iterator it = beans.entrySet().iterator();
while(it.hasNext()){
Map.Entry row = (Entry) it.next();
System.out.println(row.getKey());
System.out.println(row.getValue();
}
De hecho getKey() me indica que voy por buen camino porque me permite visualizar el nombre del objeto resultsetcolleccion que guarde en el map. Pero cuando intento imprimir los datos, es decir descargar el contenido del resultSetCollection lo unico que obtengo es el iterar tantas veces como numero de registros me entrego la consulta, pero los datos
ID NOMBRE TELEFONO ....... no los logro recuperar
No entiendo estas líneas:
beans.put("DATA",collection);
¿Cómo está declarado ese beans?
Map beans = new HashMap<>();
beans = model.getHashmodel();
Aquí hay dos beans con diferentes asignaciones...
Estas en lo correcto, lo he hecho así para no copiar toda una hoja de código que no viene al caso. Así en la primera función utilizo una variable (beans) de tipo hashMap, y en la segunda recupero su contenido en otra variable del mismo tipo. Observa bien en la segunda función escribo
Map beans = new HashMap<>();
beans = model.getHashmodel();
donde model.getHashmodel() es el nombre de la primera funcion, que ademas retorna el tipo hashMap
¿Este row.getValue() qué tipo es?.
Da la impresión de que es un Map, luego, si contiene el resultado de la consulta, deberás iterarlo a su vez para obtener las filas.
Si usases genéricos se vería todo más claro.
Buenas,
Lo suyo es que hagas:
ResultSetCollection dataList = beans.get("DATA");
Y luego ya iteres la coleccion dataList.
Un saludo
Muchas gracias por su colaboración, gracias a ella he podido modificar el codigo de la siguiente manera
Map test = new HashMap<>();
test = model.getHashmodel();
ResultSetCollection datalist = (ResultSetCollection) test.get("DATA");
Iterator it = datalist.iterator();
while(it.hasNext()){
System.out.println(it.next());
HashMap a = (HashMap) it.next();
System.out.println(a.values());
//Map.Entry row = (Entry) it.next();
//System.out.println(row.getKey() + " " + row.getValue());
}
ahora mi inconveniente es imprimir los datos dentro de cada fila
No estás iterando el HashMap a = (HashMap) it.next();
Para obtener sus valores individuales debes construir un iterador específico.
Bueno atendiendo vuestra sugerencia he codificado lo siguiente
Map test = new HashMap<>();
test = model.getHashmodel();
ResultSetCollection datalist = (ResultSetCollection) test.get("DATA");
Iterator it = datalist.iterator();
while(it.hasNext()){
HashMap a = (HashMap) it.next();
System.out.println(a.values());
System.out.println("size of hashmap " + a.size());
}
Desafortunadamente me muestra el siguiente error
org.apache.commons.beanutils.ResultSetIterator cannot be cast to java.util.HashMap
lo que me muestra que estoy haciendo mal al intentar obtener los valores de los registros a traves del hashmap
Estás usando una librería externa, que no sé exactamente cuál es.
Me parece que el problema no está en recorrer un Map, sino en los tipos que devuelven los métodos de esa librería, como apunté en otro mensaje anterior.
Si la librería implementa una colección propia (lo que suelen hacer en casos similares), también implementará un iterador propio para recorrerla.
Si devuelve tipos del JDK, es inevitable saber cuáles son, para poder procesarlos.
Creo que es una libreria de jxls (http://jxls.sourceforge.net/reference/resultset.html) y lo que devuelve cada elemento de la coleccion es un resultset, que a su vez es una coleccion que hay que recorrer.
Yo es lo que no entiendo desde el principio. Porque para un simple select de una tabla no se utiliza el resultset o simplemente se recorre guardandolo en una lista para usarlo luego?
Un saludo
es exacto se trata de una utilidad de la libreria jxls. Verá en conjunto el paquete que estoy haciendo debe traer datos de cualquier bd y exportarlos a diferentes tipos de archivos, uno de ellos xls, de ahi el motivo de utilizar la libreria, ahora bien si se podria utilizar un resultset, pero la consecuencia de ello seria tener dos objetos relacionados con la base de datos, cuyo costo en procesamiento es significativo. Lo otro es que en desarrollo no hay motivo por el cual no aprovechar el objeto de tipo resultsetcollection ya implementado.
Muchas gracias
Ok, pues asi a ojo tu codigo deberia entonces tener un aspecto similar a este:
Map test = new HashMap<>();
test = model.getHashmodel();
ResultSetCollection datalist = (ResultSetCollection) test.get("DATA");
Iterator it = datalist.iterator();
while(it.hasNext()){
ResultSet rs = (ResultSet) it.next();
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + "\t" + supplierID +
"\t" + price + "\t" + sales +
"\t" + total);
}
}
Donde tendras que poner el verdadero nombre y tipo de tus campos de la tabla en lugar de los ficticios coffeName, price, etc.
Un saludo
Hay algo muy confuso en todo este asunto.
Si la consulta a la base de datos se hace sobre una única tabla, un simple select con su prepared statement y su result set es suficiente para devolver los datos de interés. Siempre puede construirse un List con un objeto Java que contenga las columnas que se quieren procesar, a partir del result set. Para ello basta con código JDBC simple, sin librerías externas.
Si la consulta necesita más de una tabla, con columnas relacionadas, lo que procede es hacer uno o varios JOIN con SQL, y aplicar lo dicho en el párrafo anterior.
He realizado consultas de ambos tipos, tanto para construir hojas de cálculo Excel, como para leerlas, con múltiples tablas relacionadas en bases de datos SQL, con JDBC sin problemas.
Buenos días,
Tengo la siguiente situación, por motivos de compatibilidad con una librería para la generación de archivos xls me veo obligado a pasar los resultados de una consulta SQL desde un ResultSet a ResultSetCollection y finalmente a un Map
Ahora necesito recuperar la información contenida en dicho objeto para otros propósitos, sin embargo por mi falta de experiencia no me ha sido posible.
Tal vez me puedan guiar, de antemano muchas gracias