[Criteria] Múltiplos AND/OR

E aí galera!

Seguinte: posso uma consulta que preciso “converter” para Criteria. A consutla original tem a seguinte cláusula:where prod.cd_produto=prde.cd_produto and prde.dm_situacao<>'E' and ( ( prde.id_caracteristica = XXX and prde.vl_caracteristica = 'ZZZ' ) or ( prde.id_caracteristica = YYY and prde.vl_caracteristica = 'WWW' ) )

O problema é que a parte do OR pode possuir variações, pois deve ser montado através de parâmetros passados pelo usuário. Ou seja, as duas cláusulas OR poderiam ser, em outros casos, 10, 50 ou qualquer outro número…

Até consigo fazer isso com o Criteria, o problema é que o método Restrictions.or aceita apenas dois critérios como argumentos, então gostaria de saber: alguém sabe uma forma “inteligente” e elegante de fazer essa condição com múltiplos OR?

Aguardo sugestões. Obrigado.


getSession().createCriteria(Class.class)add(Restricions.or("nomePropriedade", 10)).add(Restrictions.or("nomePropriedade", 50));

//ou você pode usar o in

getSession().createCriteria(Class.class).add(Restrictions.in("propertyName", values));

//onde values é uma coleção de valores

Obrigado pela tentativa de ajuda, mas não é disso que preciso.

Se verificares o exemplo de SQL que coloquei, possuo sempre duas condições em um AND (ex.: id_caracteristica = X and tx_valor = Y), sendo que esta condição composta passa a compor um OR que pode ter o número de cláusulas variável (ou seja, o 10 e o 50 não tem nada a ver com o valor de uma propriedade, mas sim da quantidade de OR que posso ter).
Além disso, o seu uso do Restrictions.or me parece bastante incorreto, uma vez que este método recebe apenas o objeto Criterion.

Sobre o IN, não me traria os resultados que preciso. Estou resolvendo utilizando o método Restrictions.sqlRestriction().

Valeu.

Realmente, olhei a documentação me passei e o uso do or do jeito que propus está errado!

Quanto ao uso do in eu entendi que você queria uma faixa de valores.

Acho que o uso do sqlRestriction ou até mesmo o uso de sql mesmo para esse caso acho o melhor, do que tentar fazer fica criteria!

Quando vc tiver todos os AND, basta fazer algo assim (por exemplo com 3):

Sendo que, se vc receber uma lista de AND com tamanho variado, vc pode fazer um loop que vai fazendo OR no Criterion anterior.