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?