Hibernate Criteria (ordenação) [RESOLVIDO]

5 respostas
L

Estou querendo ordenar uma consulta através de um dos objetos da consulta, porem o CRITERIA do hibernate aparentemente não é capz de fazer isso

eu tenho 1 entidade Cidade, que contem id,nome,estado e estado é uma FK um ID para outra entidade chamada Estado...

A minha Criteria esta assim...

//Em resumo a query quer dizer:
        //todos de Cidade onde (nome contém 'João' E estado != paraiba)
        //Ordene por estado
        List<Cidade> cidades2 = SESSION
            .createCriteria(Cidade.class)
                .add(
                    Expression.and(
                        Expression.like("nome", "%João%"),
                        Expression.not(Expression.eq("estado", paraiba))
                    )
                )
                .addOrder(Order.asc("estado"))
                .list();

        //apenas para constar... paraíba é um Objeto do tipo estado resgatado assim
        Estado paraiba = (Estado)SESSION
            .createCriteria(Estado.class)
                .add(Expression.eq("nome", "Paraíba"))
                .uniqueResult();

o fato é que a Indexação de estado não é por ordem alfabética e por exemplo meu código de bahia e são paulo é fora de ordem.... e o order do criteria ordena pela ordem do index... mesmo estando minha classe Estado implementado comparable corretamente...

public class Estado implements Serializable, Comparable<Estado>{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @Column(name = "nome")
    private String nome;

    //...
    public int compareTo(Estado o) {
        return nome.compareTo(o.nome);
    }
}

existe alguma forma do criteria do Hibernate ordenar pela ordem do Objeto ?? e não pela do Index ?? usando o Comparable ??

a ordem da consulta sai conforme abaixo... mostrando são paula como o 1° resultado e bahia no ultimo, o que pela ordem do index esta correto, porem pela ordem natural da classe Estado não esta =/

se alguem puder ajudar agradeço

João Ramalho/São Paulo
São João da Boa Vista/São Paulo
São João das Duas Pontes/São Paulo
São João de Iracema/São Paulo
São João do Pau d`Alho/São Paulo
São João do Jaguaribe/Ceará
João Neiva/Espírito Santo
São João da Paraúna/Goiás
São João d`Aliança/Goiás
João Lisboa/Maranhão
São João Batista/Maranhão
São João do Carú/Maranhão
São João do Paraíso/Maranhão
São João do Soter/Maranhão
São João dos Patos/Maranhão
João Monlevade/Minas Gerais
João Pinheiro/Minas Gerais
São João Batista do Glória/Minas Gerais
São João da Lagoa/Minas Gerais
São João da Mata/Minas Gerais
São João da Ponte/Minas Gerais
São João das Missões/Minas Gerais
São João del Rei/Minas Gerais
São João do Manhuaçu/Minas Gerais
São João do Manteninha/Minas Gerais
São João do Oriente/Minas Gerais
São João do Pacuí/Minas Gerais
São João do Paraíso/Minas Gerais
São João Evangelista/Minas Gerais
São João Nepomuceno/Minas Gerais
Antônio João/Mato Grosso do Sul
São João da Ponta/Pará
São João de Pirabas/Pará
São João do Araguaia/Pará
João Alfredo/Pernambuco
São João/Pernambuco
João Costa/Piauí
São João da Canabrava/Piauí
São João da Fronteira/Piauí
São João da Serra/Piauí
São João da Varjota/Piauí
São João do Arraial/Piauí
São João do Piauí/Piauí
São João/Paraná
São João do Caiuá/Paraná
São João do Ivaí/Paraná
São João do Triunfo/Paraná
São João da Barra/Rio de Janeiro
São João de Meriti/Rio de Janeiro
Coronel João Pessoa/Rio Grande do Norte
João Câmara/Rio Grande do Norte
João Dias/Rio Grande do Norte
São João do Sabugi/Rio Grande do Norte
São João da Baliza/Roraima
São João da Urtiga/Rio Grande do Sul
São João do Polêsine/Rio Grande do Sul
São João Batista/Santa Catarina
São João do Itaperiú/Santa Catarina
São João do Oeste/Santa Catarina
São João do Sul/Santa Catarina
Cedro de São João/Sergipe
Coronel João Sá/Bahia
João Dourado/Bahia
Mata de São João/Bahia

5 Respostas

_

Fala cara, blz.?

Bom, pelo o que eu entendi o Hibernate está fazendo a ordenação pela FK (id do estado) mas você gostaria de fazer pelo nome do estado, é isso?

Se for isso, tente criar um alias (JOIN) para o estado e fazer a ordenação por algum atributo do objeto estado, por exemplo:

List<Cidade> cidades2 = SESSION.createCriteria(Cidade.class)
            .createAlias("estado", "estado")
            .add(Expression.and(Expression.like("nome", "%João%"),
                                Expression.not(Expression.eq("estado", paraiba))))
            .addOrder(Order.asc("estado.nome"))
            .list();

Tenta utilizar essa forma e ver se funciona. Caso queira mais informações entre aqui.

[]`s

L

vlw cara…!! era isso mesmo q eu tava procurando e tentando fazer… vou dar uma olhada melhor no funcionamento do createAlias, c eu tiver dificuldades volto a postar…

abraços!

_

Blz cara, qualquer coisa posta aí.

[]`s

L

Funcionou perfeito!! brigadão ai!

agora deu pra deixar bem OO … vlw mesmo… fiz ate uma consulta maluca pra testar e ordenou certinho

List&lt;Cidade&gt; cidades = SESSION .createCriteria(Cidade.class) .createAlias("estado", "Estado") .createAlias("Estado.capital", "Capital") .createAlias("Estado.pais", "Pais") .add( Expression.and( Expression.like("nome", "%João%"), Expression.not(Expression.eq("Estado.nome", "Paraíba")) ) ) .addOrder(Order.asc("Pais.nome")) .addOrder(Order.asc("Capital.nome")) .addOrder(Order.asc("nome")) .list();

brigadão… resolvido ^^

_

Blz cara!

[]`s

Criado 22 de março de 2009
Ultima resposta 23 de mar. de 2009
Respostas 5
Participantes 2