Como fazer um SELECT dinâmico? [RESOLVIDO]

33 respostas
P

Pessoal,

Tenho que fazer uma consulta no banco (DAO), mas os campos que eu devo pesquisar (que vão no SELECT, NÃO no where) são dinâmicos.

A pessoa vai selecionar os campos (checkbox) e devo retornar para a tela os resultados apenas dos campos selecionados, não dos demais.

Dúvida:

Qual o melhor jeito de fazer isso? Retornar todos os dados (colocando todos os campos para pesquisar no banco) e tentar tratar no JSP (com JSTL?) ou fazer um alguma maneira de montar o SELECT com stringbuilder por exemplo?

33 Respostas

L

Pacato:
Pessoal,

Tenho que fazer uma consulta no banco (DAO), mas os campos que eu devo pesquisar (que vão no SELECT, NÃO no where) são dinâmicos.

A pessoa vai selecionar os campos (checkbox) e devo retornar para a tela os resultados apenas dos campos selecionados, não dos demais.

Dúvida:

Qual o melhor jeito de fazer isso? Retornar todos os dados (colocando todos os campos para pesquisar no banco) e tentar tratar no JSP (com JSTL?) ou fazer um alguma maneira de montar o SELECT com stringbuilder por exemplo?

Acho que entendi o que quer. Traga tudo o que quer (no select usando asterisco *). Quando chegar no front-end, popule o que estiver checado e não popule o que estiver chacado. Pode fazer as verificações do que vai popular ou não usando javascript. Mas por que precisa fazer desta forma?
Na maioria das vezes, quando preciso fazer uma pesquisa por vários campos, eu faço select com like.
O ideal é que utilize algum ORM. JPA ou Hibernate. Se preferir fazer na mão seu SQLs, use prepared statements:
http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

cada caractere de interrogação será substituido de forma transparente pra vc, evitando problemas como de sql injection.

P

Olá Luiz obrigado pelo retorno...

Eu me deparei com isso pq é no SELECT, pois nas condições (WHERE) eu fiz outra vez assim:

private static final String SQL_ATUAL = " SELECT.... "+ "WHERE (";

public List<ListaMedGraf> listaMedGraf(List<String> select) {
		Connection conn = null;
		PreparedStatement ps = null;
		List<ListaMedGraf> listaMedGrafRelatorio = new ArrayList<ListaMedGraf>();

		if (!select.isEmpty()) {
sql.append(" Dispositivo.CodigoTecnologia IN (");
			for (Iterator<Integer> it = select.iterator(); it.hasNext();) {
				it.next();
				sql.append("?");
				if (it.hasNext()) {
					sql.append(",");
				}
			}
			sql.append(")");
		}

		try {

			conn = ConnectionManager.obterConexao();
			ps = conn.prepareStatement(SQL_ATUAL + sql.toString() + GROUP + ORDER);
			int indicePs = 1;

			if (!select.isEmpty()) {
				for (Integer i : select) {
					ps.setInt(indicePs++, i);
				}
			}

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {

				ListaMedGraf listaRelatorio = new ListaMedGraf(
						rs.getString("CodTecnologia"),
						rs.getString("Operadora"), rs.getString("StatusSIMCard"),
						rs.getString("Quantidade"));

				listaMedGrafRelatorio.add(listaRelatorio);

			}

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

		return listaMedGrafRelatorio;

	}

Era passado uma lista de inteiro (códigos que deveriam ser pesquisados)...

Eu estava pensando em fazer algo similar... mas na hora de montar o result set, daria trabalho para montar o retorno....

Outro problema no meu caso é que estou mexendo com iframe.. então a tela que abre de resultado não é a que estão os checkbox, então acho que com javascript não rola...

L

Se o problema for por causa do retorno, por que não devolve uma string em JSON pra este caso?

Pensando bem, eu não entendi o problema. To vendo que quer trabalhar com estatística.
Não sei se faria da mesma forma porque não sei como está estruturado seus dados e aparentemente que utilizar o mesmo fonte para várias tabelas.
Este tipo de ajuda não sei se pode ser dada em um forum. Acho que vai precisar de um analista ai pra fazer uma análise mais profunda.

P

O problema está assim…

Tenho umas páginas com JSP que são abertas dentro de um iframe

Uma destas telas ao abrir, consulto no BD de acordo com o que foi selecionado em uma outra página, para então voltar o valor.

Ai que está o problema, para eu montar o select não a condição dele.

Na tela de resultado trato com JSTL, mas não sei se ao consultar eu trato na classe entes de retornar…

L

vc pode dar 3 exemplos de como ficariam os selects? (String exemplo do qu quer). Talvez desta forma eu entenda um pouco como estão estruturados seus dados e exatamente o que quer.

Pelo que entendi, vc não pode retornar simplesmente uma lista de classes, pois seus conteúdos seriam muito dinâmicos. Por isso sugeri o JSON como retorno pois evitaria a necessidade de ter de escrever um Value Object para cada tipo de retorno. Neste caso, DAO, retornaria um ResultSet mesmo. E na classe final, antes de enviar ao cliente, converteria para JSON.

Como disse, só uma análise mais profunda para saber qual a melhor solução. Possivelmente, pro seu caso, terá até subselects. Não? Quem for sugerir a melhor opção pra vc vai precisar entender bem o que quer e a forma como foram estruturados seus dados. Acho que o que está querendo é muito genérico.

L

Sobre DTO:

P

Entendi Luiz…

Não tem subselect, é mais simples do que vc imagina…

é assim, tenho por exemplo, o campo idade, nome e matricula… Ai dessa vez só quero o nome, então o select só para trazer o nome:

SELECT nome from xxx where xxx

Agora quero nome e idade:

SELECT nome, idade from xxx where xxx

Fui mais claro? sou meio confuso para explicar rsrsrs…

e estes campos, são da página index (que serão fixos).
O resultado será em uma nova página que será carregada dentro do iframe…

L

Pacato:
Entendi Luiz…

Não tem subselect, é mais simples do que vc imagina…

é assim, tenho por exemplo, o campo idade, nome e matricula… Ai dessa vez só quero o nome, então o select só para trazer o nome:

SELECT nome from xxx where xxx

Agora quero nome e idade:

SELECT nome, idade from xxx where xxx

Fui mais claro? sou meio confuso para explicar rsrsrs…

e estes campos, são da página index (que serão fixos).
O resultado será em uma nova página que será carregada dentro do iframe…

Então é exatamente como lhe sugeri no no primeiro reply. Traga tudo (*). O usuário não pode ver tudo o que tá no seu select?

P

Não… eu tenho que mostrar na tela apenas o resultado que ele escolheu, pois o que ele vai escolher é praticamente o título da tabela que trarei de resultado…

Então se ele não selecionou, então não posso mostrar a coluna com dado que ele não selecionou.

L

Pacato:
Não… eu tenho que mostrar na tela apenas o resultado que ele escolheu, pois o que ele vai escolher é praticamente o título da tabela que trarei de resultado…

Então se ele não selecionou, então não posso mostrar a coluna com dado que ele não selecionou.

Ok. Entendi.
Então, neste caso, sugeriria utilizar uma modal (que no momento de retorno verificaria o que está checado) ou passar esses valores via querystring (url) no momento de abrir seu iframe.

Se o dado está sendo checado pelo usuário, então ele teria a opção de ver o resultado. Se não tem, de forma nenhuma, porque ele não tem por seu perfil de acesso a opção de visualizar tal resultado, teria que ter um select diferente.

O melhor é mesmo trazer todos os campos (*) e de acordo com o checkbox (se modal) selecionado (ou variável da sua querystring na url se iframe) para criar ou não a coluna.

mais uma perguntinha… quantos campos teriam estas tabelas? mais de 40? Se vc paginar o resultado, não me preocuparia com o tamanho dos dados que estão trafegando para o cliente. mandaria tudo mesmo e lá no cliente o checkboxe selecionado determinaria se a coluna apareceria ou não. Na cláusula where, usaria like.

P

São 15 colunas… não é tanto assim…

Obrigado Luiz… vou dar uma tentada aqui com suas dicas e retorno com o resultado ok?

A

UÈ cada check possui um identificador é só ver quais estão checados e montar o select, por favor não faça select * … se sua aplicação crescer, logo log vai ficar um sistema lendo e gerar manutencao

P

lá alexafe blz?

o problema maior está em montar a lista depois disso... consegui montar um select de acordo com a seleção (coloco os campos em um array e verifico quais foram selecionados e envio para montar o SELECT) mas o problema está no retorno para formar a lista:

Aqui monto o select:

private static final String SQL_SELECT_MED_GRAF = " SELECT ";
	private static final String SQL_WHERE_MED_GRAF = " FROM tb_telemetria WHERE cod_usuario = 1 ";


public List<ListaMedGraf> listaMedGraf(List<String> select) {
....
		if (!select.isEmpty()) {
			Iterator<String> it = select.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.toString() + SQL_WHERE_MED_GRAF);
while (rs.next()) {

// MAS AQUI QUE TRAVA... COMO VOU MONTAR A LISTA? SE O SELECT É DINÂMICO?

				ListaMedGraf listaRelatorio = new ListaMedGraf(
						rs.getString("Cod"),
						rs.getString("Oper"), rs.getString("Status")
						);

				listaMedGrafRelatorio.add(listaRelatorio);

			}

Por esse problema estou pensando em trazer todo o resultado e depois eu separo verificando qual foi selecionado

A

User ResultSetMetaData aqui vc tem todas as informacoes do retorno da consulta, inclusive as coluna retornadas, da vc cria os objetos por reflexao e seta por reflexao e vai adicionando na lista assim fica dinamico :slight_smile:
Se vc nunca trabalhou com reflexao, estude por que vai resolver sua vida em muitos fatores.

P

Já ouvi falar, mas não faço ideia… vc teria algum exemplo por favor?

A

Não tenho nenhum exemplo agora, mas estude ResultSetMetaData que provem do ResultSet da consulta em jdbc e tb estude a reflexão, do seu caso para chamar métodos set e get por reflexão.

P

blz… vou dar uma estudada… é que tenho que entregar na semana que vem esse problema… caso eu não consiga por esse novo meio…

Valeu pela colaboração

P

N amontagem da lista?

ListaMedGraf listaRelatorio = new ListaMedGraf( rs.getString("Cod"), rs.getString("Ope"), rs.getString("Status") );

Como eu faria? é aqui que vc fala para usar essa reflexão?

vi um exemplo de resultsetmetadata:

Parece simples… mas não sei como eu montaria minha lista com o total de parâmetros corretos… pois pode ser que não retorne todos…

A

Vc iria fazer um for varrendo as colunas retornadas, dentro do for vc vai ter acesso a tudo que precisa é só olhar os metodoss de retorno do Result. dai vc ia criando o objeto , faria um for nos metodos do objeto, iri chamar os set do objeto por reflexao de acordo com as colunas retornadas, injetava os dados e adicionaria o objeto na lista, pronto :). Mais igual te falei tem que estudar reflexao. Se vc nao conseguir faz uma gambiarra qualquer e depois estuda e concerta rrss

E

cara testa aew, funcionou aqui, fiz com oracle

no servlet coloquei isso
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();
		}

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

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)

List<String> listaCampos = new ArrayList<String>();
		
		String A = null;
		String B = null;
		String C = null;
		
		listaCampos.add("A");
		listaCampos.add("B");
		listaCampos.add("C");

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

if (!select.isEmpty()) {
					Iterator<String> it = select.iterator();
					while (it.hasNext()) {
						String valor = it.next(); 
					    
					    if (it.hasNext()) {
					    	
					    	
					    }
					}
				}

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

P

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

P

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

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;

	}
E

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);
E

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

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();
		}
	}
	
}
P

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};

	}
E

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

P

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

E

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.

P

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

E

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

P

vdd… esquece que falei…

vou continuar com os testes aqui… valeu

P

CONSEGUI (MOS)

Desculpe a todos pela minha falta de conhecimento...

Mas iniciante é uma merda... rs

DAO:

public Object[] listaMedGraf3(List<String> selecionado, String v, String login) {
		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_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};

	}

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:

<c:if test="${medicoes ne null}">	
				<br>
					<table border= "1px" cellspacing= "0" cellpadding= "3" id="table" class="sortable">
						<thead>
						
							<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>
Criado 15 de setembro de 2014
Ultima resposta 18 de set. de 2014
Respostas 33
Participantes 4