[RESOLVIDO]Dúvida criteria

6 respostas
J

Boa tarde a todos…

Estou com o seguinte problema.

Preciso buscar os dados atravez dessa criteria

public List<TpgTipoGeo> filter(String descricao, String descricaoSuperior) {

        Criteria c = getSession().createCriteria(getPersistentClass());
        
        if (descricao != null && !descricao.equals("")) {
            c.add(Restrictions.ilike("tpgDescricao", descricao+"%", MatchMode.START));
        }

        /*if (descricaoSuperior != null && !descricaoSuperior.equals("")) {
            c.add(Restrictions.ilike("tpgSuperior.tpgDescricao", descricaoSuperior+"%", MatchMode.START));
        }*/

        if (descricaoSuperior != null && !descricaoSuperior.equals("")) {
            c.createAlias("tpgSuperior.tpgDescricao", "tpgSuperior.tpgDescricao").add(Restrictions.ilike("tpgSuperior.tpgDescricao", descricaoSuperior+"%", MatchMode.START));
        }

        return c.list()!=null?c.list():new ArrayList<TpgTipoGeo>();
    }

Entretanto, não está dando certo pq eu estou passando uma String no campo “descricaoSuperior” e na minha tabela, ela é id de um cara que é da própria tabela em questão, como na tabela anexa. Sendo assim, apresenta o seguinte erro:

org.hibernate.QueryException: not an association: tpgDescricao

É natural pq tpgDescricao é String e tpgSuperior é um int.

Como eu resolvo este problema da criteria com essa referencia a ele mesmo?

Obrigado a todos.


6 Respostas

aurelio_silva

Tente criar uma subCriteria, talvez algo do tipo:

if (descricaoSuperior != null && !descricaoSuperior.equals("")) {  
        c.createCretiria("tpgTipoGeo").add(Restrictions.ilike("tpgDescricao", descricaoSuperior+"%", MatchMode.START))
}
marcelo.bellissimo

Manda o mapeamento dessa Classe TpgTipoGeo, pois nesse trecho:

… voce está dizendo que essa classe possui um atributo chamado tpgSuperior, que provavelmente é uma outra classe que tem um atributo tpgDescricao, e é isso que ele está reclamando, que não encontrou esse mapeamento:

…, aliás, essa sintaxe que voce está usando não faz sentido, com o createAlias, que serve justamente pra reduzir o nome da associação colocando um apelido (alias) pra ele… veja a documentação do Hibernate, o 3º exemplo demonstra o que estou falando:

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html

J

Muito obrigado Aurélio, funcionou perfeitamente.

Só fiz uma pequena adaptação:

if (descricaoSuperior != null && !descricaoSuperior.equals("")) {
       c.createCriteria("tpgSuperior").add(Restrictions.ilike("tpgDescricao", descricaoSuperior+"%", MatchMode.START));
}

Só mais uma dúvida, você tem algum material sobre criteria?
Pesquisei aqui no GUJ mas, não obtive sucesso.

Vlw mesmo pela ajuda.

J

marcelo.bellissimo:
Manda o mapeamento dessa Classe TpgTipoGeo, pois nesse trecho:

… voce está dizendo que essa classe possui um atributo chamado tpgSuperior, que provavelmente é uma outra classe que tem um atributo tpgDescricao, e é isso que ele está reclamando, que não encontrou esse mapeamento:

…, aliás, essa sintaxe que voce está usando não faz sentido, com o createAlias, que serve justamente pra reduzir o nome da associação colocando um apelido (alias) pra ele… veja a documentação do Hibernate, o 3º exemplo demonstra o que estou falando:

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html

aurelio_silva

jcmaster:
Muito obrigado Aurélio, funcionou perfeitamente.

Só fiz uma pequena adaptação:

if (descricaoSuperior != null && !descricaoSuperior.equals("")) {
       c.createCriteria("tpgSuperior").add(Restrictions.ilike("tpgDescricao", descricaoSuperior+"%", MatchMode.START));
}

Só mais uma dúvida, você tem algum material sobre criteria?
Pesquisei aqui no GUJ mas, não obtive sucesso.

Vlw mesmo pela ajuda.

Opa, estamos ai…
Sobre o material, aprendi criteria lendo uma apostila de um colega que estudou na caelum…e usando o doc do hibernate.org

http://docs.jboss.org/hibernate/stable/core/reference/en/html/querycriteria.html

Até mais

marcelo.bellissimo

aurelio_silva:
Opa, estamos ai…
Sobre o material, aprendi criteria lendo uma apostila de um colega que estudou na caelum…e usando o doc do hibernate.org

http://docs.jboss.org/hibernate/stable/core/reference/en/html/querycriteria.html

Até mais

Aliás, a documentação do Hibernate é muito boa pra tirar dúvidas, recomendo pra todos que estiverem mexendo, ou pretendem mexer com hibernate, dar uma lida especialmente nos exemplos, pois dá pra aprender muito só de ver os exemplos… eu aprendi assim, e sempre que tenho dúvidas já vou direto na documentação dele… ajuda muito mesmo…

Criado 28 de janeiro de 2010
Ultima resposta 28 de jan. de 2010
Respostas 6
Participantes 3