[RESOLVIDO] Hibernate Restrictions "or" Funciona mas "and" não - DetachedCriteria e Subquerries

tenho uma classe de Usuarios e uma de Grupos com relacionamento ManyToMany.

quando mando buscar Usuarios de acordo com o ID do Grupo utilizando de Restrictions.or ele busca os dados corretamente, mas quando busco por Restrictions.and ele não encontra nada. mas a busca com or (e verificação manual no banco de dados) me provam que existiriam essa coincidência. Alguém já teve um problema parecido?

Como está criando a consulta?

ola drsmachado, segue a criação da Criteria:

Criteria consulta = session.createCriteria(CadastroUsuarios.class);
//criação de Alias omitidas

consulta.add(Restrictions.and(Restrictions.eq("grupo.cadgrId", grpEconomico), Restrictions.eq("grupo.cadgrId", grpRegioes)));
consulta.addOrder(Order.asc("cadusId"));

trocando o “and” por “or” ela busca os dados corretamente

Restrictions.and(Restrictions.eq("grupo.cadgrId", grpEconomico), Restrictions.eq("grupo.cadgrId", grpRegioes))

Isso aí só vai acontecer se grupo.cadgrId for igual a grpEconomico e grpRegioes. Talvez por isso não traga nada.

Olá Ataxexe,

entendi o que vc disse, mas, nesse caso, você saberia me dizer qual seria a forma de buscar uma intersecção dos usuários entre os dois grupos?

[quote=Ijimero]Olá Ataxexe,

entendi o que vc disse, mas, nesse caso, você saberia me dizer qual seria a forma de buscar uma intersecção dos usuários entre os dois grupos?[/quote]

Se for o que eu entendi (você tem dois grupos: grpEconomico e grpRegioes), pode usar o “or” no lugar do “and”, igual ao que você estava fazendo.

então, se eu buscar por OR, a busca me trará os usuários que estão no grpEconomico E os usuarios que estão no grpRegioes, mas eu quero os usuarioes que estão nos dois grupos ao mesmo tempo.

Pelo que entendi, você quer os registros em que

"grupo.cadgrId" = grpEconomico
//E ao mesmo tempo
"grupo.cadgrId" = grpRegioes

Certo?

O que acontece é que provavelmente você tenha apenas uma coluna que representa o valor cadgrId de um grupo, correto? Logo, você nunca terá, ao mesmo tempo uma linha em que o valor de cadgrId seja igual a grpEconomico e grpRegioes.

O or funciona pois ele não exige que o valor seja igual aos dois parâmetros, ao mesmo tempo. Ele é inclusivo. Ou cadgrId = grpEconomico, ou cadgrId = grpRegioes ou ambos. Só no caso de não ser igual a nenhum dos dois que nenhum registro virá.

Para que você consiga trazer resultados em que o valor de uma coluna deve atender a mais de um parâmetro, ao mesmo tempo, será necessário utilizar um OUTER LEFT JOIN…
Só que eu nunca fiz isso no hibernate…

Ops, entendi direito agora. Você vai ter que fazer a consulta mais ou menos assim

"from CadastroUsuarios as cadastro where :grupo1 member of cadastro.grupo and :grupo2 member of cadastro.grupo"

Não manjo muito de hql, mas acho que é mais ou menos assim.

[quote=drsmachado]Pelo que entendi, você quer os registros em que

"grupo.cadgrId" = grpEconomico
//E ao mesmo tempo
"grupo.cadgrId" = grpRegioes

Certo?

O que acontece é que provavelmente você tenha apenas uma coluna que representa o valor cadgrId de um grupo, correto? Logo, você nunca terá, ao mesmo tempo uma linha em que o valor de cadgrId seja igual a grpEconomico e grpRegioes.

O or funciona pois ele não exige que o valor seja igual aos dois parâmetros, ao mesmo tempo. Ele é inclusivo. Ou cadgrId = grpEconomico, ou cadgrId = grpRegioes ou ambos. Só no caso de não ser igual a nenhum dos dois que nenhum registro virá.

Para que você consiga trazer resultados em que o valor de uma coluna deve atender a mais de um parâmetro, ao mesmo tempo, será necessário utilizar um OUTER LEFT JOIN…
Só que eu nunca fiz isso no hibernate…[/quote]

entendi…

irei pesquisar sobre como fazer isso no Hibernate. com o Termo em SQL deve facilitar. retornarei amanhã com o resultado disso. Obigado!

[quote=Ataxexe]Ops, entendi direito agora. Você vai ter que fazer a consulta mais ou menos assim

"from CadastroUsuarios as cadastro where :grupo1 member of cadastro.grupo and :grupo2 member of cadastro.grupo"

Não manjo muito de hql, mas acho que é mais ou menos assim.[/quote]

irei procurar uma forma de fazer isso no Hibernate, volto amanhã com o resultado disso. Obrigado!

Bom, depois de um tempo de pesquisa decidi por usar o OR e depois filtrar a lista que vem para alcançar o resultado desejado… essa pode não ser a melhor prática, mas infelizmente estou trabalhando em toque de urgência, e como tenho 0 experiência com HQL, prefiro evitar ao máximo utiliza-lo pelo menos por enquanto…

se alguém quiser ainda postar mais alguma coisa, eu agradeço de qualquer forma.

valeu pessoal!

[quote=Ijimero]Bom, depois de um tempo de pesquisa decidi por usar o OR e depois filtrar a lista que vem para alcançar o resultado desejado… essa pode não ser a melhor prática, mas infelizmente estou trabalhando em toque de urgência, e como tenho 0 experiência com HQL, prefiro evitar ao máximo utiliza-lo pelo menos por enquanto…

se alguém quiser ainda postar mais alguma coisa, eu agradeço de qualquer forma.

valeu pessoal![/quote]

Eu faria a mesma coisa no seu lugar também…hehehe…tem horas que infelizmente não dispomos de tempo pra resolver o problema da melhor forma.

Só não deixe de dar uma olhada depois pra não deixar o sistema cheio de remendos.

[quote=Ataxexe][quote=Ijimero]Bom, depois de um tempo de pesquisa decidi por usar o OR e depois filtrar a lista que vem para alcançar o resultado desejado… essa pode não ser a melhor prática, mas infelizmente estou trabalhando em toque de urgência, e como tenho 0 experiência com HQL, prefiro evitar ao máximo utiliza-lo pelo menos por enquanto…

se alguém quiser ainda postar mais alguma coisa, eu agradeço de qualquer forma.

valeu pessoal![/quote]

Eu faria a mesma coisa no seu lugar também…hehehe…tem horas que infelizmente não dispomos de tempo pra resolver o problema da melhor forma.

Só não deixe de dar uma olhada depois pra não deixar o sistema cheio de remendos.[/quote]

sim, isso com certeza… terminando essa fase teremos mais tempo e eu procurarei a melhor solução… achando ela eu volto aqui e posto… =p

Depois de muito tempo, ainda no mesmo projeto me deparei com a mesma situação em uma relação muito mais complexa, e usar um filtro porco seria complicado demais… mas agora FINALMENTE encontrei a solução, e não foi via HQL…

a resposta é o uso de Subqueries, que fabrica Criterions que envolvem a criação de subconsultas. Para usar qualquer método da Subqueries precisamos de uma DetachedCriteria.

segue um link com uma BELA explicação:

mal posso acreditar que nunca mais vou ter que me preocupar com isso