Como fazer um SELECT dinâmico? [RESOLVIDO]

cara testa aew, funcionou aqui, fiz com oracle

no servlet coloquei isso

[code]try {
Class.forName(DRIVER);
Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);

		String select = "";
		
		//escolhe sua tabela do banco
		String nomeTabela = "suaTabelaDoBanco";
		
		Statement st = con.createStatement();
		
		HashMap<String, String> hash = new HashMap<String, String>();
		 
		 ResultSet rs = st.executeQuery("SELECT * FROM "+nomeTabela +" where rownum < 1");
		 try {
			 ResultSetMetaData rsMetaData = (ResultSetMetaData) rs.getMetaData();
			 for(int i=1;i<=rsMetaData.getColumnCount();i++) {
				 //aqui vc tem todas colunas rsMetaData.getColumnName(i) e vc vai mostra-la no seu checkbox
				 hash.put(i+"", rsMetaData.getColumnName(i));
			 }
		 } catch (Exception e) {
			 	e.printStackTrace();
		 }
		 rs.close();
		 
		 // faz de conta q o cara escolheu o item 1,3,4 q vc selecionou no checkbox
		 List<String> listaChecados = new ArrayList<String>();
		 listaChecados.add("1");
		 listaChecados.add("3");
		 listaChecados.add("4");
		 
		 
		 List<String> names = new ArrayList<String>();
		 
		 for(String s :listaChecados){
			 if(select.length()==0){
				 select += hash.get(s);
			 }else{
				 select += ","+ hash.get(s);
			 }
			 names.add(hash.get(s));
		 }
		 
		 List<Object[]> listaJsp = new ArrayList<Object[]>();
		 System.out.println("select "+select+" from "+nomeTabela);
		 
		 rs = st.executeQuery("select "+select+" from "+nomeTabela);
		 while (rs.next()) {
			 Object[] obj = new Object[listaChecados.size()];
			 for(int i=0;i<listaChecados.size();i++){
				 obj[i] = rs.getObject(new Integer(i+1))+"";
			 }
			 listaJsp.add(obj);
		 }
		 
		 rs.close();
		 st.close();
		 con.close();
		 
		 request.setAttribute("listaJsp",listaJsp);
		 request.setAttribute("names",names);
		 
		 
		RequestDispatcher rd = request.getRequestDispatcher("teste.jsp");
		rd.forward(request, response);
		 
	} catch (Exception e) {
		e.printStackTrace();
	}[/code]

no jstl coloquei assim

<table border="1"> <c:forEach items="${names}" var="names"> <th> ${names} </th> </c:forEach> <c:forEach items="${listaJsp}" var="item"> <tr> <c:forEach items="${item}" var="value"> <td> ${value} </td> </c:forEach> </tr> </c:forEach> </table>

Pensei em pegar uma lista que eu já tenho (com os dados que foram selecionados na tela)
Depois, pegar uma lista pré definida (com os campos do select)

Ai verificaria se os campos da lista pré definida estão na lista dos selecionados na tela, assim, os que não tiverem eu setaria como null

Mas ai fica… como? rsrs

Lista dos campos pré definidos (usados no Select)

[code] List listaCampos = new ArrayList();

	String A = null;
	String B = null;
	String C = null;
	
	listaCampos.add("A");
	listaCampos.add("B");
	listaCampos.add("C");[/code]

Essa é como eu verifico os campos que foram selecionados na tela (objeto select):

[code] if (!select.isEmpty()) {
Iterator it = select.iterator();
while (it.hasNext()) {
String valor = it.next();

				    if (it.hasNext()) {
				    	
				    	
				    }
				}
			}[/code]

Só que… como eu passaria essa lista e se o valor não tivesse eu setaria como nulo?

Oi Edu… valeu… não vi que tinha postado… vou tentar aqui

Estou tentando adaptar para meu caso, mas está preenchendo nulo os dados para o select:

[code]

Connection conn = null;
PreparedStatement ps = null;
String select = “”;
HashMap<String, String> hash = new HashMap<String, String>();
List<Object[]> listaJsp = new ArrayList<Object[]>();

	try {
	 ResultSet rs = ps.executeQuery("SELECT * FROM tb_telemetria where rownum < 1");
	 
		 ResultSetMetaData rsMetaData = (ResultSetMetaData) rs.getMetaData();
		 for(int i=1;i<=rsMetaData.getColumnCount();i++) {
					 hash.put(i+"", rsMetaData.getColumnName(i));
		 }
	rs.close();	 
	} catch (Exception e) {
	 	e.printStackTrace();
	}
	 
	 
	 try{
	 List<String> names = new ArrayList<String>();
	 
	 for(String s :selecionado){
		 if(select.length()==0){
			 select += hash.get(s);
		 }else{
			 select += ","+ hash.get(s);
		 }
		 names.add(hash.get(s));
	 }
	 
	
	 System.out.println(SQL_SELECT_MED_GRAF + select + SQL_WHERE_MED_GRAF);
	 
	 ResultSet rs = ps.executeQuery(SQL_RELATORIO_MED_GRAF);
	 ps.setString(1, v);
	 ps.setString(2, login);
		
	 while (rs.next()) {
		 Object[] obj = new Object[selecionado.size()];
		 for(int i=0;i<selecionado.size();i++){
			 obj[i] = rs.getObject(new Integer(i+1))+"";
		 }
		 listaJsp.add(obj);
	 }
	 
	 rs.close();
	 ps.close(); 
	 
} catch (Exception e) {
	e.printStackTrace();
}


	 return listaJsp;

}[/code]

debuga aew bicho

na variavel “selecionado” ta trazendo oq? ali tem q ter suas chaves que foram criadas aqui hash.put(i+"", rsMetaData.getColumnName(i)); , vá nesse hash e veja os valores q tem dentro, igual eu fiz aqui

List listaChecados = new ArrayList();
listaChecados.add(“1”);
listaChecados.add(“3”);
listaChecados.add(“4”);

Primeiro de tudo vc conseguiu rodar?

faça o seguinte, rode essa classe main sem seu projeto web, só coloque no lugar do xxxx suas conexoes

[code]public class Teste {
private static final String DRIVER = “oracle.jdbc.driver.OracleDriver”;
private static final String URL = “xxx”;
private static final String USERNAME = “xxx”;
private static final String PASSWORD = “xxx”;

public static void main(String[] args) {
	try {
		Class.forName(DRIVER);
		Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		
		String select = "";
		
		//escolhe sua tabela do banco
		String nomeTabela = "tb_telemetria";
		
		Statement st = con.createStatement();
		
		HashMap<String, String> hash = new HashMap<String, String>();
		 
		 ResultSet rs = st.executeQuery("SELECT * FROM "+nomeTabela +" where rownum < 1");
		 try {
			 ResultSetMetaData rsMetaData = (ResultSetMetaData) rs.getMetaData();
			 for(int i=1;i<=rsMetaData.getColumnCount();i++) {
				 //aqui vc tem todas colunas rsMetaData.getColumnName(i) e vc vai mostra-la no seu checkbox
				 hash.put(i+"", rsMetaData.getColumnName(i));
			 }
		 } catch (Exception e) {
			 	e.printStackTrace();
		 }
		 rs.close();
		 
		 // faz de conta q o cara escolheu o item 1,3,4 q vc selecionou no checkbox
		 List<String> listaChecados = new ArrayList<String>();
		 listaChecados.add("1");
		 listaChecados.add("3");
		 listaChecados.add("4");
		 
		 
		 List<String> names = new ArrayList<String>();
		 
		 for(String s :listaChecados){
			 if(select.length()==0){
				 select += hash.get(s);
			 }else{
				 select += ","+ hash.get(s);
			 }
			 names.add(hash.get(s));
		 }
		 
		 List<Object[]> listaJsp = new ArrayList<Object[]>();
		 System.out.println("select "+select+" from "+nomeTabela);
		 
		 rs = st.executeQuery("select "+select+" from "+nomeTabela);
		 while (rs.next()) {
			 Object[] obj = new Object[listaChecados.size()];
			 for(int i=0;i<listaChecados.size();i++){
				 obj[i] = rs.getObject(new Integer(i+1))+"";
			 }
			 listaJsp.add(obj);
		 }
		 
		 rs.close();
		 st.close();
		 con.close();
		 
		for(Object[] obj :listaJsp){
			for (Object object : obj) {
				System.out.print(object+" | ");
			}
			System.out.println("\n");
		}
		 
		 
	} catch (Exception e) {
		e.printStackTrace();
	}
}

}[/code]

Oi Edu… eu tinha executado sim… retornava os valores do select (campos para consultar) null…

Fiz esse novo que vc me pediu ele da erro no “rownum” pois uso o postgres… qual funções serve esse rownum? assim tento fazer em postgress…

Outra coisa… é melhor deixar em servlet? ou jogar na DAO e recuperar depois?

Estou tentando seguir sua lógica… pois gostei dessa de separar a lista com os títulos das colunas e outra com os resultados, mas não consegui pegar direito os resultados… principalmente para colocar na tela:

DAO:

No servlet:

System.out.println("ISSO1: " + obj[0]); // Lista títulos.. Aqui vem valor
System.out.println("ISSO2: " + obj[1]); // Lista dos resultados.. Aqui não
		Connection conn = null;
		PreparedStatement ps = null;
		List<Object[]> listaJsp = new ArrayList<Object[]>();
		List<String> titulos = new ArrayList<String>();
	
		
		if (!selecionado.isEmpty()) {
			Iterator<String> it = selecionado.iterator();
			while (it.hasNext()) {
			    String valor = it.next();
			    sql.append(valor);
			    if (it.hasNext()) {
			    	sql.append(", ");
			    }
			}
		}

		try {
			
			conn = ConnectionManager.obterConexao();
			ps = conn.prepareStatement(SQL_SELECT_MED_GRAF + sql + SQL_WHERE_MED_GRAF);
			ps.setString(1, v);
			ps.setString(2, login);
			System.out.println("SQL: " + SQL_SELECT_MED_GRAF + sql + SQL_WHERE_MED_GRAF);
			ResultSet rs = ps.executeQuery();
			ResultSetMetaData rsmd=rs.getMetaData();  
			int numColumns = rsmd.getColumnCount();  
			
			for (int i=0; i<numColumns; i++) { 
				titulos.add(rsmd.getColumnName (i + 1));
				System.out.println("COLUNAS: " + rsmd.getColumnName (i + 1));
			}
			
			while (rs.next()) {
				 Object[] obj = new Object[selecionado.size()];
				 for(int i=0;i<selecionado.size();i++){
					 obj[i] = rs.getObject(new Integer(i+1))+"";
					 System.out.println("ISSO?: " + obj.toString());
				 }
				 listaJsp.add(obj);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionManager.fecharConexao(conn, null, ps);
		}

		return new Object[]{titulos, listaJsp};

	}

vamos passo a passo
tenta fazer com o metodo main sem servidor sem nada, se não está funcionando o select tira o “where rownum < 1” e tenta, cara tem ir tentando

foi isso que fiz edu… só que ele pega as 3 primeiras colunas da tabela e não as que estão selecionadas…
O resultado que retorna é também correspondente das 3 primeiras colunas…

Desculpe se não me expressei direito…

Eu estou adaptando sua lógica com o que eu passei de código… só não está passando os valores do resultado correto, mas dos títulos consegui pegar blz…

Nessa parte aqui que não está pegando o valor correto:

while (rs.next()) { Object[] obj = new Object[selecionado.size()]; for(int i=0;i<selecionado.size();i++){ obj[i] = rs.getObject(new Integer(i+1))+""; System.out.println("ISSO?: " + obj.toString()); } listaJsp.add(obj); }

Ai retorno para o servlet as duas listas:

return new Object[]{titulos, listaJsp};

No serrvlet:
request.setAttribute(“medicoes”, medicoes3[0]); // SET a primeira lista de títulos

A de títulos vem correta, mas a do resultado não… vem com aqueles [Ljava.lang.Object;@29d31] (alocamento)

ai para pegar o valor do obj na JSP faço:

<tr class="resultado"> <c:forEach var="medicoes" items="${medicoes}"> <td style="border-color:white" style="border-style:groove"><c:out value='${medicoes}'/></td> </c:forEach> </tr>

Tirando o fato que não pegou as configurações de estilo, enviou os dados corretamente…

Então resumindo, estou com problema para pegar o valor da segunda lista, a de resultados

vamos la

do jeito q eu fiz funciona assim

faço um select para achar as colunas da tabela com ResultSetMetaData(não precisa do rownum)

ex: a tabela XXX tem colunas ‘aaa’,‘bbb’,‘ccc’,‘ddd’

eu coloco esses valores no hash ex ‘aaa’ vai ter chave 1(em sequencia),‘bbb’ vai ter chave 2 e assim por diante. ok?
Isso vc vai usar para popular seu checkbox e mostrar para o usuario

la na tela o usuario vai ter ‘aaa’,‘bbb’,‘ccc’,‘ddd’, para exemplo suponha q ele selecionou ‘aaa’ e ‘ccc’, logo os valores selecionados no checkbox serão 1 e 3, correto?

eu fiz assim pois assumi q o usuario ja tinha escolhido os valores 1, 3 e 4.

List<String> listaChecados = new ArrayList<String>();  
             listaChecados.add("1");  
             listaChecados.add("3");  
             listaChecados.add("4"); 

no seu caso

List<String> listaChecados = new ArrayList<String>(); listaChecados.add("1"); listaChecados.add("3");

depois é só fazer o select e percorrer com o tamanho do selecionados

se vc nao entendeu nao adianta ficar tentando adaptar no seu codigo

cria um projeto java novo, cria um pacote, coloca a classe Teste q eu te passei, configura a conexao com o banco, coloca o jar da conexao do seu banco e tenta rodar até funcionar, DEPOIS q entender tente adaptar para seu projeto, vai ser mais simples.

Oi Edu… eu entendi a maior parte do seu código sim, a única coisa que ainda está me confundindo é:

  • A consulta (SELECT) os campos pegam em ordem, e não pelo que foi selecionado… tipo vem 1, 2 e 3, ao invés dos campos referentes à consulta.

  • Para pegar os resultados (Retorno do SELECT) ele pega na mesma ordem 1, 2 e 3, e não o que foi selecionado…

Por isso estava tentando adaptar sua lógica com partes do seu código…

Mas vou dar umas boas testadas por aqui ok? desculpe ficar amolando vcs… é que não tenho tanto conhecimento em desenvolvimento web… Mas muito obrigado, depois de fazer o que me recomendou retorno com a resposta

ué da um print do q foi selecionado e mostra pra mim

do jeito q eu fiz vc pode colocar 4 , 2 e 5 que vai trazer as colunas na mesma ordem, vc deve estar fazendo alguma cagada

vdd… esquece que falei…

vou continuar com os testes aqui… valeu

CONSEGUI (MOS)

Desculpe a todos pela minha falta de conhecimento…

Mas iniciante é uma merda… rs

DAO:

[code]
public Object[] listaMedGraf3(List selecionado, String v, String login) {
Connection conn = null;
PreparedStatement ps = null;
List<Object[]> listaJsp = new ArrayList<Object[]>();
List titulos = new ArrayList();

	if (!selecionado.isEmpty()) {
		Iterator<String> it = selecionado.iterator();
		while (it.hasNext()) {
		    String valor = it.next();
		    sql.append(valor);
		    if (it.hasNext()) {
		    	sql.append(", ");
		    }
		}
	}

	try {
		
		conn = ConnectionManager.obterConexao();
		ps = conn.prepareStatement(SQL_SELECT_MED_GRAF + sql + SQL_WHERE_MED_GRAF);
		ps.setString(1, v_chassi);
		ps.setString(2, login);
		System.out.println("SQL: " + SQL_SELECT_MED_GRAF + sql + SQL_WHERE_MED_GRAF);
		ResultSet rs = ps.executeQuery();
		ResultSetMetaData rsmd=rs.getMetaData();  
		int numColumns = rsmd.getColumnCount();  
		
		for (int i=0; i<numColumns; i++) { 
			titulos.add(rsmd.getColumnName (i + 1));
			System.out.println("COLUNAS: " + rsmd.getColumnName (i + 1));
		}
		
		while (rs.next()) {
			 Object[] obj = new Object[selecionado.size()];
			 for(int i=0;i<selecionado.size();i++){
				 obj[i] = rs.getObject(new Integer(i+1))+"";
				 System.out.println("ISSO?: " + obj[i].toString());
			 }
			 listaJsp.add(obj);
		}

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		ConnectionManager.fecharConexao(conn, null, ps);
	}

	return new Object[]{titulos, listaJsp};

}[/code]

NO SERVLET:

try {
				HttpSession session = request.getSession();
				String login = (String) session.getAttribute("loginUsuario");
				
				VerificarMedGrafResultado vMedGrafResultado = new VerificarMedGrafResultado();
				

				
				medicoes3 = vMedGrafResultado.Verificador3(dadosMedGraf, v, login);
						
				
				request.setAttribute("dadosMedGrafRetorno", retorno);  
				request.setAttribute("v", v);
				request.setAttribute("dataIni", dataIni);
				request.setAttribute("dataFin", dataFin);
				request.setAttribute("horaIni", horaIni);
				request.setAttribute("horaFin", horaFin);

				request.setAttribute("medicoes", medicoes3[0]);
				request.setAttribute("resultados", medicoes3[1]);
				request.getRequestDispatcher("medGraf.jsp").forward(
						request, response);
				
			} catch (BiffException e) {

				e.printStackTrace();
			} catch (ClassNotFoundException e) {

				e.printStackTrace();
			} catch (SQLException e) {

				e.printStackTrace();
			} catch (Exception e) {

				e.printStackTrace();
			}

NO JSP:

[code]
<c:if test="${medicoes ne null}">



						<tr>
							<c:forEach var="medicoes" items="${medicoes}">
								<th><h3>&nbsp;<c:out value='${medicoes}'/>&nbsp;</h3></th>
							</c:forEach>
						</tr>
					

					</thead>
					<tbody>
	
						<c:forEach var="resultado" items="${resultados}">
						<tr class="resultado">
							<c:forEach var="valores" items="${resultado}">
								<td style="border-color:white" style="border-style:groove"><c:out value='${valores}'/></td>
							</c:forEach>
						</tr>	
						</c:forEach>
						
					

					</tbody>
				</table>
[/code]