Session.CreateCriteria , tem como OR?[RESOLVIDO]

4 respostas
A
Bom dia pessoal, Gostaria de saber se tem como eu fazer um CreateCriteria do Hibernate com OR ao inves de AND
public List pessoaByCPF(String cpf) {
        String cpfSemChar = Util.retiraChar(cpf);

         return session.createCriteria(PessoaFisica.class)
                 .add(Restrictions.ilike("documento", cpf)).list();
         .add(Restrictions.ilike("documento", cpfSemChar)).list();
    }

SQL:
where documento = '[CPF removido]' AND documento = '[telefone removido]'

A minha ideia era ser algo assim:
SQL:
where documento = '[CPF removido]' OR documento = '[telefone removido]'

-- Estou fazendo do modo feio. Usando HSQL. Porem gostaria de usar o createCriteria.
public List pessoaByCPF(String cpf) {
        String cpfSemChar = Util.retiraChar(cpf);

        return session.createQuery(
                "from PessoaFisica where documento  = '" + cpf + "' or documento = '" + cpfSemChar + "'").list();
    }

4 Respostas

Alexandre

Você já ouviu falar da opção disjunction da API? Da uma olhadinha…vai matar isso ae rápido!
Abraço!

A

Fala meu Chará…
Não sei como voce resolveria esse meu problema com disjunction.
Dei uma lida na api e mesmo assim não vi nada que podesse me ajudar.

Mas graca a voce encontrei a Classe Expression, essa me ajudou.

Fiz de várias formas, ambas funcionaram.
Agora gostaria de saber qual é a mais recomendada ou mais rapida.

return session.createCriteria(PessoaFisica.class)
               .add(Expression.in("documento", new String[]{cpf , Util.retiraChar(cpf)})).list();

O SQL gerado:

where this_1_.documento in ( ?, ? )

Acho que esse é o mais recomendavel:

return session.createCriteria(PessoaFisica.class)
                .add(Expression.or(
                        Expression.ilike("documento", cpf),
                        Expression.ilike("documento", Util.retiraChar(cpf)))).list();

O SQL gerado:

where ( lower(this_1_.documento) like ? or lower(this_1_.documento) like ? )

Outra coisa que me deixou curioso foi a sintaxe ilike que no mysql nao existe. Mas no postgreSQL existe.
Porque nao gerou erro? O Hibernate consegue administrar bem isso?
Veja que ele fez o SQL certo. Porem eu coloquei de proposito ilike no meu metodo.

SE possivel, posta a solucao com disjunction.
Estou postando a solucao para ajudar mais pessoas no futuro :smiley:

Flw Alexandre!

[]'s

A
Mais uma solucao:
return session.createCriteria(PessoaFisica.class)
                .add(Restrictions.or(
                        Restrictions.like("documento", cpf),
                        Restrictions.like("documento", Util.retiraChar(cpf)))).list();
O SQL gerado:
where
        (
            this_1_.documento like ? 
            or this_1_.documento like ?
        )

Não sei se voce reparou. Mas no caso do Expression o SQL gerado usa uma sintaxe lower. E o Restrictions não usa essa sintaxe.

Uma vez eu vi um post aqui no guj recomendando o uso de Restrictions. Achei o post, segue abaixo o que ele falou:
Dois detalhes:
1. Se você está utilizando o Hibernate 3.x, use Restrictions.like e não Expression.like no exemplo do Luis.
2. Leia toda a documentação. É grande e chata na maior parte. Mas leia toda a documentação.
[url]http://www.guj.com.br/posts/list/45729.java[/url] Sabe me dizer a diferenca de Expression e Restrictions?
jsign

Olá pessoal,
Aproveitando o tópico tenho um script de busca para listagem conforme parametros setados ou não.

session.createCriteria(DepartamentoServico.class)
				.addOrder(Order.asc("nome"))
				.setFirstResult(pagination.getDe())
				.setMaxResults(pagination.getAte())
				.add(
						Restrictions.or(
							Restrictions.or(
								Restrictions.or(
										Restrictions.ilike("nome", departamentoServico.getNome(), MatchMode.ANYWHERE),
										Restrictions.ilike("descricao", departamentoServico.getNome(), MatchMode.ANYWHERE)
								),
								Restrictions.or(
										Restrictions.eq("horas", departamentoServico.getHoras()),
										Restrictions.eq("departamento.id", departamentoServico.getDepartamento().getId())
								)
							),
							Restrictions.eq("ativo", departamentoServico.getAtivo())
						)
					)
				.list();

Gosto de usar o CriteriaS mas achei estranha a maneira de montar este composto de clausulas OR’s

Algem sabe me dizer se é possível usar algo parecido ao que faz mmeu ficticio metodo (orS) no script abaixo.

.add(
					Restrictions.orS(
									Restrictions.ilike("nome", departamentoServico.getNome(), MatchMode.ANYWHERE),
									Restrictions.ilike("descricao", departamentoServico.getNome(), MatchMode.ANYWHERE),
									Restrictions.eq("horas", departamentoServico.getHoras()),
									Restrictions.eq("departamento.id", departamentoServico.getDepartamento().getId()),
									Restrictions.eq("ativo", departamentoServico.getAtivo())
					)
				)

O que daria uma saída parecida à OR(1 = 2, 3 = 6, 6 = 5, 4 = 4)


Jsign

Criado 24 de dezembro de 2006
Ultima resposta 8 de fev. de 2011
Respostas 4
Participantes 3