Duvida consulta hibernate

5 respostas
vinicius_roc

Eu estou tentando fazer a seguinte consulta usando criteria

select * 
from usuario u
where u.idUsuario in (select idUsuario
                      from UsuarioBackOffice
                      where loginAlternativo = '46991782000179 ')
or u.idUsuario in (select idUsuario
                   from UsuarioCorporate
                   where loginAlternativo = '46991782000179 ')
or u.idUsuario in (select idUsuario
                   from UsuarioPrestador
                   where loginAlternativo = '46991782000179 ')

A minha criteria é a seguinte

DetachedCriteria backoffice = DetachedCriteria.forClass(UsuarioBackOffice.class)
													  .setProjection(Property.forName(UsuarioBackOffice.PROP_idUsuario))
													  .add(Restrictions.eq(UsuarioBackOffice.PROP_loginAlternativo, login));																						
		DetachedCriteria corporate = DetachedCriteria.forClass(UsuarioCorporate.class)
													 .setProjection(Property.forName(UsuarioCorporate.PROP_idUsuario))
													 .add(Restrictions.eq(UsuarioCorporate.PROP_loginAlternativo, login));
		DetachedCriteria prestador = DetachedCriteria.forClass(UsuarioPrestador.class)
													 .setProjection(Property.forName(UsuarioPrestador.PROP_idUsuario))
													 .add(Restrictions.eq(UsuarioPrestador.PROP_loginAlternativo, login));

		try {
			
			Session hSession = HibernateUtil.getSession();
			
			Criteria criteria = hSession.createCriteria(Usuario.class);
			
			Criteria criteria = hSession.createCriteria(Usuario.class);
			
			criteria.add(Property.forName(Usuario.PROP_idUsuario).in(backoffice));
		
			criteria.add(Restrictions.or(Property.forName(Usuario.PROP_idUsuario).in(backoffice), Property.forName(Usuario.PROP_idUsuario).in(prestador)));

Só que esta me retornando a seguinte consulta

select *
from USUARIO this_
where this_.idUsuario in (select this_.idUsuario as y0_
from MLPS_VIEW_USUARIOBACKOFFICE this_
where this_.loginAlternativo='admin ')
and ( this_.idUsuario in (select this_.idUsuario as y0_
from MLPS_VIEW_USUARIOCORPORATE this_
where this_.loginAlternativo='admin ')
or this_.idUsuario in (select this_.idUsuario as y0_
from MLPS_VIEW_USUARIOPRESTADOR this_
where this_.loginAlternativo='admin '))

Como eu faço para em vez de adicionar esse 'and (' adicionar simplesmente or?

Tentei usar o Restrictions.or mas ele me limita a só duas consultas.

Como faço essa consulta?

Muito Obrigado

5 Respostas

bland

Olá Vinicius!

O Restrictions.or limita-se a apenas dois argumentos. Para que você possa fazer com mais de dois argumentos, você precisa tratar isso a nível de lista. Sendo assim, tem um método na classe Restrictions que te retorna um objeto que você pode trabalhar exatamente da maneira que deseja. É o Restrictions.disjunction().

Esse método retorna um objeto do tipo Disjunction, e com ele você pode adicionar quantas restrições do tipo ‘or’ você desejar. Após finalizar, basta adicionar no criteria principal que tudo irá funcionar corretamente.

Qualquer dúvida, posta aqui.

Abraço.

vinicius_roc

Valew só não entendi como posso fazer para adicionar varios ‘or’

Conseguir fazer isso:

Disjunction disjunction = Restrictions.disjunction(); criteria.add(disjunction);

agora como faço para adicionar 3 ‘or’?

não entendi =/

E valew pela ajuda.

Abss

vinicius_roc

é só da um .add e dentro a consulta?

Disjunction disjunction = Restrictions.disjunction().add(Property.forName(Usuario.PROP_idUsuario).in(corporate)); criteria.add(disjunction);

é isso? ai ele ja entende como um ‘or’?

bland

Exatamente Vinicius, a medida que você vai adicionando novas restrições ele vai entendendo que você quer fazer um ‘or’ com todas essas restrições.

Sendo assim, se você quer aplicar mais de um ‘or’, basta que você adicione ao seu Disjunction mais restrições.

Espero ter ajudado.

Abraço.

vinicius_roc

Funcionou perfeito!!!

Valew =D

Criado 3 de novembro de 2009
Ultima resposta 3 de nov. de 2009
Respostas 5
Participantes 2