Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Obtener nombres de columnas partiendo de un SQL

Buenas noches, quisiera saber de que forma podria obtener el nombre de unas columnas
partiendo de una sentencia SQL.

por ejemplo.
SQL = "Select nb_mama as Madre, nb_papa as Padre from Familia";
de que forma, podra obtener
Madre
Padre
la finalidad es para colocarlo de titulo de un jtable, en las columnas..
Gracias desde YA.

julio 3, 2012 | Registered Commenterfendz

Estoy bastante confuso respecto de tu pregunta.

No sé si es lo que quieres, pero veamos: con el método getMetadata() del ResultSet puedes obtener los nombres de las columnas.

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getMetaData()
http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html

Mi duda sobre tu pregunta es: ¿Vas a esperar a obtener el ResulSet del query para construir el header de la JTable?.

julio 3, 2012 | Registered Commenterchoces

choces, Gracias por responder..
lo que pretendo hacer es como un from de busqueda generico , o estandar, que se arme con tan solo pasarle un SQL, no se si tienes una solucion que mejor se adpte a mi necesidad, la cuestion por ejemplo, para una busqueda avanzada de clientes, tengo un form ( jtable y un jtextf para el filtrado), y para proveedores otro from con las mismas caracteristicas, y asi.. de vendedores, entre otros, serias mas o menos como 5 forms, quisiera reducir eso a 1 solo, que se auto cree partiendo de una consulta SQL.

es decir., que el mismo formulario sea para todo, que identifique como si fuese inteligente, el SQL que le estoy pasando.

espero haya logrado ser explicito.

nuevamente gracias.

julio 3, 2012 | Registered Commenterfendz

Ya entiendo lo que quieres hacer: una única JTable que se "adapte" en función del tipo de consultas SQL.

La solución consiste en crear un JTable "neutra", y para cada tipo de consulta crear un modelo y un header específico.

Necesitas declarar una clase que implemente TableModel, como por ejemplo ésta:

public class JPTableModel<T> extends AbstractTableModel {

private static final long serialVersionUID = 8521178060564486490L;
private transient final String[] tableHeader;
private transient final Map<Integer, List<T>> tableData;
private transient final int rows, columns;

public JPTableModel(final String[] header, final Map<Integer, List<T>> tableData) {
super();
this.tableHeader = Arrays.copyOf(header, header.length);
this.tableData = new HashMap<>(tableData);
this.rows = this.tableData.size();
this.columns = this.tableHeader.length;
}

public String[] getHeader() {
return Arrays.copyOf(tableHeader, tableHeader.length);
}

public Map<Integer, List<T>> getTableData() {
return new HashMap<>(tableData);
}

@Override
public int getRowCount() {
return Integer.valueOf(rows);
}

public boolean isEmpty() {
return rows == 0;
}

@Override
public int getColumnCount() {
return Integer.valueOf(columns);
}

@Override
public String getColumnName(final int col) {
return tableHeader[col];
}

@Override
public int findColumn(final String colname) {
int col = 0;
for (; col <= tableHeader.length; col++) {
if (tableHeader[col].equals(colname)) {
break;
}
}
return col < tableHeader.length ? col : -1;
}

@Override
public T getValueAt(final int rowIndex, final int columnIndex) {
return tableData.get(rowIndex).get(columnIndex);
}

public List<T> getTableRowData(final int rowIndex) {
return tableData.get(rowIndex);
}
}

Cada vez que necesites cambiar los datos, creas un modelo a partir de esta clase, y usas el setModel de JTable para actualizarlo.

Solo es un ejemplo (que funciona bien porque yo mismo lo he creado y lo uso desde hace años). Tal vez debas adaptarlo a tus requisitos; pero la idea general es esa.

julio 3, 2012 | Registered Commenterchoces

Por aclarar mejor, porque creo que no se "ve" con facilidad ;)

Este parámetro <final Map<Integer, List<T>> tableData> en el constructor, procede del ResultSet del query SQL que realices, en el supuesto de que te resulte conveniente transformar el ResultSet en un Map. Personalmente creo que es lo más práctico, si realizas consultas usando JDBC.

julio 3, 2012 | Registered Commenterchoces

Gracias Choces, Excelente respuesta..
habia empezado a contruir algo, con tu primera solucion, los links que me enviaste me sirvieron de mucho, ya habia empezado a contrur esto.

ConexionBaseDato cxn = new ConexionBaseDato();
String SQL=jTextField1.getText();
cxn.consulta(SQL);
try {
ResultSetMetaData rsmd =cxn.reg.getMetaData();
int NumeroColumnas = rsmd.getColumnCount();
NomCol = new String[NumeroColumnas];
while(cxn.reg.next()){
for (int x=1;x<=NumeroColumnas;x++){
NomCol[x-1]=rsmd.getColumnLabel(x);
System.out.println(rsmd.getColumnLabel(x));
}
}
} catch (SQLException ex) {
Logger.getLogger(prueba.class.getName()).log(Level.SEVERE, null, ex);
}
datos=new Object[1][2];
jTable1.setModel(new DefaultTableModel(datos, NomCol));

------------------
Pero Ahora voy aprobar con tu segunda recomendacion, que de hecho por lo que pudever me trae incluso el tamaño de los campos, me parece interesantisimo..
Nuevamente Gracias por tu Ayuda.
Saludos Hermano. Gracias por Todo.

julio 3, 2012 | Registered Commenterfendz