Ordenando por parâmetro

6 respostas
M

Tenho uma pagina web com as seguintes opções:

<form name="form_order" method="post" action="index.jsp">
	Ordenar Por:
	<input type="radio" name="parametro" value="2" 
		  onclick="form_order.submit();"/>Vencimento	
	<input type="radio" name="parametro" value="3" 
		  onclick="form_order.submit();"/>Usuario
</form>

Meu SQL:

sql = cnct.conn.prepareStatement
	("SELECT id, vencimento, usuario FROM tabela ORDER BY ?");
sql.setInt(1, parametro);

O problema é que ele não está ordenando de acordo com o escolhido, o que pode ser ?

Grato.

6 Respostas

maquiavelbona

http://forum.java.sun.com/thread.jspa?threadID=478053&messageID=2223214

Até!

T

Você não pode setar nomes de colunas em um PreparedStatement. Você só pode setar valores.
(A razão é que um PreparedStatement na verdade é uma forma de dar uma instrução ao banco de dados para otimizar a query SQL, passando apenas os novos valores de parâmetros e possibilitando a pré-compilação.
Entretanto, pré-compilação, em qualquer banco SQL, supõe que os nomes das colunas sejam fixos, e você só altere valores. )
No seu caso você teria de montar a string SQL com os nomes das colunas desejadas.

M

thingol:
Você não pode setar nomes de colunas em um PreparedStatement. Você só pode setar valores.
(A razão é que um PreparedStatement na verdade é uma forma de dar uma instrução ao banco de dados para otimizar a query SQL, passando apenas os novos valores de parâmetros e possibilitando a pré-compilação.
Entretanto, pré-compilação, em qualquer banco SQL, supõe que os nomes das colunas sejam fixos, e você só altere valores. )
No seu caso você teria de montar a string SQL com os nomes das colunas desejadas.

Qual seria a solução para eu ter esta funcionalidade de ordenar de acordo com o campo desejado ??

Grato.

T

Solução porca e rápida:

sql = cnct.conn.prepareStatement  
     ("SELECT id, vencimento, usuario FROM tabela ORDER BY " + parametro);

É claro que você provavelmente vai usar uma cláusula WHERE para não puxar dados demais do banco, não?

M

thingol:
Solução porca e rápida:

sql = cnct.conn.prepareStatement  
     ("SELECT id, vencimento, usuario FROM tabela ORDER BY " + parametro);

É claro que você provavelmente vai usar uma cláusula WHERE para não puxar dados demais do banco, não?

Sim, usarei Where, este foi só pra exemplificar.

Mas se eu fizer assim vou perder a otimização do SQL ficar pré compilado após executado pela primeira vez ?? Isto acarretará em algum problema, tipo perca de desempenho ??

VAlew.

T

“Perca” é o nome de um peixe :stuck_out_tongue:
De qualquer maneira, depende um pouco de seu banco.
Muitos bancos costumam ter internamente um pool de expressões SQL pré-compiladas, então se você solicitar um relatório por vencimento e um pouco depois um outro relatório por vencimento, então ele já terá a expressão pré-compilada.

Criado 18 de outubro de 2007
Ultima resposta 18 de out. de 2007
Respostas 6
Participantes 3