Hibernate: ordenação de palavras acentuadas

2 respostas
H

Fala, galera!

Estou com o seguinte problema:

Eu tenho uma combo de cidades que deve ser apresentada ordenada alfabeticamente. Porém, cidades que possuem acentuação no nome não estão sendo ordenadas corretamente. Ex.:

- ABAETÉ
- ALFENAS
- BELO HORIZONTE
- ROMARIA
- VIÇOSA
- ÁGUA COMPRIDA
- ÁGUAS FORMOSAS

O banco de dados da aplicação é o PostgreSQL 8.1, e se eu rodar o SQL abaixo, no Postgre, funciona.

select * from cidade c 
where c.id_uf = 'MG' and c.ativa=true 
order by (translate( upper(c.dsc_cidade), text 'ÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇÑ', text 'AEIOUAEIOUAOAEIOUAEIOUCN'))

Porém, se eu tentar fazer coisa parecida em HQL como:

String queryString = "from Cidade c where c.uf.id = ? and c.situacaoAtiva=true " +
    			"order by (translate( upper(c.nome), text 'ÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇÑ', text 'AEIOUAEIOUAOAEIOUAEIOUCN'))";

ControleTransacaoHibernate controleTransacao = new ControleTransacaoHibernate(true);
Session session = controleTransacao.getSessao();
Query query = session.createQuery(queryString);
query.setParameter(0, _uf.getId());
			
List<Cidade> cidades = query.list();
controleTransacao.commit();
return cidades;
Então, é lançada uma exceção na chamada do método session.createQuery(queryString).
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 'ÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇÑ' near line 1, column 130 [Cidade c where c.uf.id = ? and c.situacaoAtiva=true order by (translate( upper(c.nome), text 'ÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇÑ', text 'AEIOUAEIOUAOAEIOUAEIOUCN'))]

Já me falaram pra usar SQL puro, mas nem tentei. Pois eu teria que mexer em todas as consultas da aplicação que também possuem este mesmo problema.
Alguém teria alguma solução para isso?

Valeu!!!

2 Respostas

V

Bom… eu não sei se o Hibernate faz isso, mas vou lhe dar outra dica…

O seu select lhe retorna objetos do tipo Cidade certo?

Vai na sua classe Cidade e implementa o compareTo (claro que, por tabela vc vai ter que sobreescrever o toString(), equals() e o hashcode())…
daí, depois que você obter o List de objetos, vc dá um Collections.sort() e pronto! Suas cidades ordenadas

T

Digamos que você tenha recuperado sua lista de cidades como:

List&lt;Cidade&gt; cidades = query.list();

e que a classe Cidade tenha o campo “nome”.
Para ordenar você mesmo (sem depender do banco de dados) as cidades recebidas, você pode usar:

List&lt;Cidade&gt; cidadesOrdenadas = new ArrayList&lt;Cidade&gt;(cidades);
final Collator ordenarIgnorandoAcentos = Collator.getInstance (new Locale ("pt", "BR"));
ordenarIgnorandoAcentos.setStrength (Collator.PRIMARY);
Collections.sort (cidadesOrdenadas, new Comparator&lt;Cidade&gt;() {
    public int compare (Cidade c1, Cidade c2) {
        return ordenarIgnorandoAcentos.compare (c1.getNome(), c2.getNome());
    }
});
// depois disto, CidadesOrdenadas conterá os valores ordenados segundo o nome da cidade.
Criado 6 de junho de 2008
Ultima resposta 6 de jun. de 2008
Respostas 2
Participantes 3