Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Imprimir contenido de un resultsetcollection

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

diciembre 12, 2013 | Registered Commenterkarlose

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?

diciembre 12, 2013 | Registered Commenterchoces

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

diciembre 13, 2013 | Registered Commenterkarlose

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...

diciembre 13, 2013 | Registered Commenterchoces

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

diciembre 14, 2013 | Registered Commenterkarlose

¿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.

diciembre 14, 2013 | Registered Commenterchoces

Buenas,

Lo suyo es que hagas:
ResultSetCollection dataList = beans.get("DATA");

Y luego ya iteres la coleccion dataList.


Un saludo

diciembre 16, 2013 | Unregistered CommenterUnoPorAhi

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

diciembre 17, 2013 | Registered Commenterkarlose

No estás iterando el HashMap a = (HashMap) it.next();
Para obtener sus valores individuales debes construir un iterador específico.

diciembre 17, 2013 | Registered Commenterchoces

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

diciembre 18, 2013 | Registered Commenterkarlose

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.

diciembre 18, 2013 | Registered Commenterchoces

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

diciembre 19, 2013 | Unregistered CommenterUnoPorAhi

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

diciembre 19, 2013 | Registered Commenterkarlose

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

diciembre 19, 2013 | Unregistered CommenterUnoPorAhi

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.

diciembre 19, 2013 | Registered Commenterchoces