Posso configurar o "ORDER BY" em um PreparedStatem

Tenho um PreparedStatemente com uma query onde tenho um “ORDER BY nome”, mas eu queria poder pesquisar em outras ordens, como por exemplo “ORDER BY idade”.

Tem como eu colocar algo como “ORDER BY ?” e depois usar um
setAlgo() para especificar o campo ‘?’ ?

otima pergunta!

qdo eu li a parte de prepared statement do jdbc, ele nao deixa bem claro que tipo de variavel ele pode substituir. mas ja que muitos bancod e dados aceitam nome de tabela entre aspas (acho q eh ansi sql, ou nao?), voce pode usar o setString, e talvez funcione. vai depender do seu BD.

mas faca o teste, e por favor nos diga o resultado.

ps: o mais elgal seria voce nao setar isso no java, pq voce ta escrevendo nome de tabela dentro do codigo java… mas se for uma sql que voce quer ordenar por vaaaarios campos, talvez compense a quebra (quase nunca compensa)

Eu estou usando o FireBird 1.5!

Minha situação é a sequinte, eu tenho um cadastro de pessoas e quero lista-las em uma JTable mesmo, para tanto eu uso um PreparedStatement
Mas agora eu preciso ter a possibilidade de criar essa JTable ordenada não só por nome, mas tb por outros campos.

Eu li a api da JTable e não achei nada que me permitisse ordenar as linhas depois de criada, seja por programação ou quando o usuario clica no cabeçalho da tabela, então preciso passar os resultados já ordenados do BD, não sei se issa é a melhor saida, mas foi a unica que eu encontrei.

Eu ja tentei usar o setString, mas da o erro: Data Tyoe unknown!

Fala Galera,

Bao a ideia do PreparedStatement eh ganhar tempo quando se tem varias execucoes do mesmo SQL onde apenas os dados mudam, sabem como ele faz isso? Assim: ele soh verifica a syntax e se as tabelas/campos que vc se referiu no seu sql existem uma unica vez, depois disso ele apenas altera os dados e confia que tudo esta ok melhorando a performance.

Como um order by depende de um nome de coluna o PreparedStatement teria que verificar se a coluna referida existe antes de exceutar, o que acabaria com o cache dele, eh isso ai :wink:

Abraco,

Oi galera,

Não sei se entendi direito a sua pergunta, mas vou tentar ajudar. Com certeza a solução não é a mais elegante mas pode resolver.
Uma solução simples seria vc concatenar no final do SQL o order by que vc quer usar. E depois passar para o PreparedStatement o SQL.

Ex: String sql = “Select * from cliente “;
if(order.equals(“nome”)){
sql = sql+” order by nome”;
}else if(order.equals(“idade”)){
sql = sql+" order by idade";
}
selectPstm = conn.prepareStatement(sql);

Com certeza vc ira perder a vantagem do PreparedStatement que o Claudio se referiu, mas acho que vc teria o resultado desejado.

Abraços

Fala galera,

[quote="carbaldi "]Uma solução simples seria vc concatenar no final do SQL o order by que vc quer usar. E depois passar para o PreparedStatement o SQL.
[/quote]

isso ai funciona, alias eh assim que se faz mesmo :slight_smile: mas se ele for executar a query que esta concatenando antes varias vezes entao pode usar PreparedStatement, agora se for pra usar uma vez soh eh melhor usar um Statement convencional.

Isso porque o Prepared eh um pouco mais lento justamente na primeira execucao, logo se for para executar varias vezes faca um PrepapredStatement concatenando o OrderBy da maneira que nosso amigo carbaldi falou :wink:

Abraco,