Restrições em Lista dinamico no Hibernate

Em um sistema de ordem de serviço, cada O.S é vinculada a uma loja, por sua vez cada usuário tem uma ou mais lojas, por exemplo o usuário José tem a loja 01 e loja 02. Já o usuário João tem permissão de acesso em 3 lojas etc…

Em um cenário estático eu faria assim:

Criteria criteria = session.createCriteria(OrdemServico.class);
		Criterion rest1 = Restrictions.eq("loja", loja1);
		Criterion rest2 = Restrictions.eq("loja", loja2);
		
		criteria.add(Restrictions.or(rest1, rest2));
		return criteria.list();

Mas no caso: vou ter que pegar uma lista de lojas de cada usuario pra fazer a consulta das ordem de serviço, como faço essa consulta dinamicamente?

Nao entendi, como assim de cada usuário? Não seria simplesmente do usuário logado?

select os.*
from ordem_servico os
inner join loja_usuario lu on (lu.id_loja = os.id_loja)
where lu.id_usuario = <id do usuario logado>

Em criteria vai depender das associações no seu modelo OO:

Restrictions.eq("loja.usuarioLoja.idUsuario", <id do usuario logado>)

1 curtida

Digo do usuario logado, vou testar aqui e te digo.

Pronto é nesse ponto que estou enrolado. Veja:

Uma Ordem de Serviço tem um Loja que tem N Usuarios (cada Usuario pode ter N Lojas).

Logo quando o usuário clicar em listar Ordem de Serviço, deve trazer todas O.S que tem as Lojas que o usuário tem permissão. Ou seja se o usuario tem permissão apenas para Loja 01, as O.S que devem aparecer deve ser apenas da Loja 01.

Só pra ter uma ideia do relacionamento:

public class OrdemServico{

        @ManyToOne
	@JoinColumn(name = "cod_loja")
	private Loja loja;
}

public class Loja{

@ManyToMany
	@JoinTable(name="usuario_loja",
	joinColumns=@JoinColumn(name="loja_codigo"),
	inverseJoinColumns=@JoinColumn(name="usuario_codigo"))
	private Set<Usuario> usuarios;

}

public class Usuario {

      @ManyToMany(mappedBy="usuarios")
	private Set<Loja> lojas;


}

Em SQL diretamente é tranquilo com Exists:

    select os.*
    from ordem_servico os
    where exists (
        select 1
        from usuario_loja ul
        where ul.id_loja = os.id_loja
        and ul.id_usuario = ?
    ) 

Entao procure como gerar Exists via Criteria. Exemplo: http://mikedesjardins.net/2008/09/22/hibernate-criteria-subqueries-exists/

Criteria é complicado mesmo. E quanto mais complexa a query mais ilegível fica. HQL é menos pior.

1 curtida

Eu não entendi muito bem. Cada OS está vinculada a uma loja, certo? Não existe uma tabela específica de OS? Esta tabela não possui relação com a tabela de lojas?
O próprio usuário, responsável pela loja, é quem consulta as OSs?