Foro sobre Java SE > Imprimir contenido de un resultsetcollection
Guenas.
Joder! Si es tan difícil no lo hagas. Contrata a alguien que sepa un mínimo.
Siento ser desagradable pero no puedo evitar pensar que no te esfuerzas en lo mas mínimo.
Disculpa pero lo siento así. Si la cosa te supera, algo mas que evidente, por que una simple conversión o el esfuerzo de escribir 7 lineas de código es demasiado para ti, contrata a alguna empresa para que te lo haga.
Lo siento pero esfuerzo no he visto. Solo picar lo que te dicen y si no sale lo que esperas vuelves a preguntar. Joder!
Utilizas librerias externas y ni te molestas en leer la doc del API.
No me extraña que a los informáticos cada vez les paguen menos. Deberían pagar ellos por entrenarse con un cliente.
Te lo han puesto a huevo, te han dicho donde están los problemas que con no mas de 3 minutos de leer habrías visto. ¿Que mas quieres?
Perdona, no te mates ni esfuerces demasiado. No vaya a ser que te de una hernia.
Que papa noel te traiga la solución sin que gastes un gramo de glucosa en utilizar esa masa esponjosa que algunos creen que es cerebro.
Hala! Un saludo y feliz navidad
Jajajajajajajaj.
Solo por educación voy a responder por única ocación su cuestionamiento, si hubiera consultado algo de lo que se a dicho aquí se hubiera dado cuenta que encontrar información al respecto no ha sido fácil, solo para información, la referencia de la API sobre el objeto http://jxls.sourceforge.net/samples/reference/resultset.html no esta disponible. Si fuera algo tan sencillo como eso no hubiera escrito en principio. De antemano agradezco su participación pero realmente si no tiene nada útil para ayudar a aclarar el tema, escribir por escribir no tiene sentido.
Sí existe documentación del API:
"If you don't want to load all ResultSet data in memory and agree to keep database connection open while processing all data you may use net.sf.jxls.report.ResultSetCollection class. This class takes ResultSet object as a parameter and implements Collection interface to operate with underlying data. In its turn ResultSetCollection uses org.apache.commons.beanutils.ResultSetDynaClass to return retrieved data as dynamic objects."
http://jxls.sourceforge.net/reference/resultset.html
"Any database data that you wish to utilize outside the context of the current row of an open result set must be copied. For example, you could use the following code to create standalone copies of the information in a result set:
ArrayList results = new ArrayList(); // To hold copied list
ResultSetDynaClass rsdc = ...;
DynaProperty[] properties = rsdc.getDynaProperties();
BasicDynaClass bdc =
new BasicDynaClass("foo", BasicDynaBean.class,
rsdc.getDynaProperties());
Iterator rows = rsdc.iterator();
while (rows.hasNext()) {
DynaBean oldRow = (DynaBean) rows.next();
DynaBean newRow = bdc.newInstance();
PropertyUtils.copyProperties(newRow, oldRow);
results.add(newRow);
}"
http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/ResultSetDynaClass.html
Muchas gracias Choses por su colaboracion, pero para orientar un poco mas las cosas me permito copiar del sitio del proyecto
"There are two ways to export ResultSet object with XLSTransformer. First one uses org.apache.commons.beanutils.RowSetDynaClass. Second one is based on net.sf.jxls.report.ResultSetCollection class"
Como tal deseo manipular y poder listar los datos de un objeto ResultSetCollection, es decir la segunda opción. Hasta donde entiendo la clase ResultSetCollection es de tipo Collection y normalmente uno iteraria utilizando el metodo iterator(), sin embargo por desconocimiento mio no me ha sido posible sino solo iterar obtener los datos al estilo objeto.getValue() me ha sido imposible
Al final he tenido que descargar la librería jXLS para encontrame con:
package net.sf.jxls.report;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.AbstractCollection;
import java.util.Iterator;
import org.apache.commons.beanutils.ResultSetDynaClass;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Allows JDBC ResultSet to be used with XLSTransformer
* Note! This is very basic implementation just to give an example of how this can be done.
* You may want to create your own implementation to use advanced features of some specific jdbc driver for example.
* @author Leonid Vysochyn
*/
public class ResultSetCollection extends AbstractCollection {
protected static final Log log = LogFactory.getLog(ResultSetCollection.class);
ResultSet resultSet;
ResultSetDynaClass rsDynaClass;
private boolean lowerCase = true;
private int numberOfRows;
/**
* Construct a new ResultSetCollection for the specified ResultSet.
* The property names corresponding to column names in the result set will be lower cased.
*
* @param resultSet - The result set to be wrapped
* @throws SQLException - if the metadata for this result set cannot be introspected
* @throws NullPointerException - if resultSet is null
*/
public ResultSetCollection(ResultSet resultSet) throws SQLException, NullPointerException {
this.resultSet = resultSet;
rsDynaClass = new ResultSetDynaClass(resultSet);
try {
setNumberOfRows();
} catch (SQLException e) {
log.error("Can't get number of ResultSet records. Try to pass it to a corresponding constructor", e);
throw e;
}
}
/**
* Construct a new ResultSetCollection for the specified ResultSet.
*
* @param resultSet - The result set to be wrapped
* @param lowerCase - Should property names be lower cased?
* @throws SQLException - if the metadata for this result set cannot be introspected
* @throws NullPointerException - if resultSet is null
*/
public ResultSetCollection(ResultSet resultSet, boolean lowerCase) throws SQLException, NullPointerException {
this.resultSet = resultSet;
this.lowerCase = lowerCase;
rsDynaClass = new ResultSetDynaClass(resultSet, lowerCase);
try {
setNumberOfRows();
} catch (SQLException e) {
log.error("Can't get number of ResultSet records. Try to pass it to a corresponding constructor");
throw e;
}
}
/**
* Construct a new ResultSetCollection for the specified ResultSet.
* The property names corresponding to column names in the result set will be lower cased.
*
* @param resultSet - The result set to be wrapped
* @param numberOfRows - The number of rows in result set
* @throws SQLException - if the metadata for this result set cannot be introspected
* @throws NullPointerException - if resultSet is null
*/
public ResultSetCollection(ResultSet resultSet, int numberOfRows) throws SQLException, NullPointerException {
this.resultSet = resultSet;
this.numberOfRows = numberOfRows;
rsDynaClass = new ResultSetDynaClass(resultSet, lowerCase);
}
/**
* Construct a new ResultSetCollection for the specified ResultSet.
*
* @param resultSet - The result set to be wrapped
* @param numberOfRows - The number of rows in result set
* @param lowerCase - Should property names be lower cased?
* @throws SQLException - if the metadata for this result set cannot be introspected
* @throws NullPointerException - if resultSet is null
*/
public ResultSetCollection(ResultSet resultSet, int numberOfRows, boolean lowerCase) throws SQLException, NullPointerException {
this.lowerCase = lowerCase;
this.resultSet = resultSet;
this.numberOfRows = numberOfRows;
rsDynaClass = new ResultSetDynaClass(resultSet, lowerCase);
}
protected void setNumberOfRows() throws SQLException {
if (resultSet != null) {
resultSet.last();
numberOfRows = resultSet.getRow();
resultSet.beforeFirst();
}
}
public int size() {
return numberOfRows;
}
public Iterator iterator() {
return rsDynaClass.iterator();
}
public boolean isLowerCase() {
return lowerCase;
}
}
Choces, muchas gracias por su orientación, al fin lo logre.
En pro de aclarar las cosas el tema va así el resultset lo había enmascarado en un ResultSetCollection y este a su ves en un Map, de ahí que tenia que haber hecho dos transformaciones una de Map a ResultSetCollection y el otro de ResultSetCollection a un objeto Iterator
Con el propósito de respetar la fuente de la información os adjunto el link
http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/ResultSetDynaClass.html
Para mi sorpresa el iterator me permite consultar los datos, pero a diferencia de lo que esperaría, cada columna de mi consulta SQL inicial se convierte en un tipo de dato.
Esto gracias a que con Iterator se puede recuperar un objeto tipo Dynabean
Ahora voy a buscar la manera de generalizar la consulta, dado que el objeto Dynabean provee el método get(String arg0 ) lo que obliga a conocer las columnas.
Finalmente muchas gracias a Choses, y a UnoPorAhi, espero poder colaborar en algo a otros también.
Bien he codificado lo siguiente
ResultSetCollection datalist = (ResultSetCollection) test.get("DATA");
Iterator it = datalist.iterator();
while(it.hasNext()){
ResultSet rsData = (ResultSet) it.next();
while(rsData.next()){
String test2 = rsData.getString(0);
}
}
Sin embargo al ejecutar el codigo me muestra el siguiente error
Exception in thread "main" java.lang.ClassCastException: org.apache.commons.beanutils.ResultSetIterator cannot be cast to java.sql.ResultSet
para la linea ResultSet rsData = (ResultSet) it.next(); de este modo entiendo que it.next lo que regresa es un ResultSetIterator y no un ResultSet
Por otro lado la idea de utilizar un list es buena, pero en el entorno que trabajo no sirve, recuerde que uno de los objetivos es pasarle la coleccion de datos a jxls para que el me entregue un archivo xls