Ordenando por parâmetro

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.

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

Até!

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.

[quote=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. [/quote]

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

Grato.

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?

[quote=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?[/quote]

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.

“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.