tbUsuario N : N tbDepto
tbDepto N : N tbPerfil
A tabela tbUsuarioPapel não faz sentido na forma como está.
Se você quiser descobrir o perfil do usuário, pelo código do usuário (idusuario), você precisa aplicar as regras de normalização de bancos de dados, que nos daria os seguintes desdobramentos
tbUsuario N : N tbDepto
tbUsuario 1 : N tb_usuario_depto
tbDepto 1 : N tb_usuario_depto
tbDepto N : N tbPerfil
tbDepto 1 : N tb_depto_perfil
tbPerfil 1 : N tb_depto_perfil
Onde, tb_usuario_depto poderia ter apenas as colunas tb_usuario_id e tb_depto_id que referenciam idusuario e iddepto respectivamente e, a tabela tb_depto_perfil, apenas tb_perfil_id e tb_depto_id que referenciam idperfil e iddepto.
Num select para obter o código do perfil, com base no id do usuário
SELECT p.idperfil FROM tbPerfil p JOIN tb_depto_perfil tdp WHERE tdp.tb_perfil_id = p.idperfil
JOIN tbDepto d WHERE d.iddepto = tdp.tb_depto_id
JOIN tb_usuario_depto tud WHERE tud.tb_depto_id = d.iddepto
JOIN tbUsuario u WHERE u.idusuario = tud.tb_usuario_id
WHERE
u.idusuario = ?
O mapeamento hibernate, neste caso, permitiria:
@ManyToMany
@JoinTable(name="tb_usuario_depto", joinColumns={@JoinColumn(name="tb_usuario_id", referencedColumnName="idusuario")},
inverseJoinColumns={@JoinColumn(name="tb_depto_id", referencedColumnName="iddepto")}}
private Collection<Departamento> deptos;
Ou algo assim…