Duvida consulta hibernate

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

[code]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)));[/code]

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

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.

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

é 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’?

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.

Funcionou perfeito!!!

Valew =D