Filtro dinâmico com hibernate

Prezados estou com o seguinte problema:

Preciso criar um módulo acoplável a determinadas aplicações que fazem pesquisa na base de dados. Esse módulo deverá filtrar as consultas limitando ao usuário enxergar os registros que ele tem permissão de acesso.

Ex.: Pesquisa por documento
Perfil 1 = só acessa os documentos criados por ele.
Perfil 2 = acessa seus documentos e os de seus funcionários
Perfil 3 = acessa todos os documentos da regional
Perfil 4 = acessa todos os documentos…

Possibilidade1: Interceptor
Usar um interceptor para capturar o SQL gerado pelo hibernate e alterá-lo de forma a contemplar a regra de negocio em questão.
Ex. de alteração no sql: “select * from (SQL DO HIBERNATE) as xpto where FILTRO DINAMICO”
Problemas:

  • meu filtro de pesquisa sempre tem que estar na consulta gerada pelo hibernate.
  • como poderei identificar as buscas que devem ou não passar por esse filtro (nem toda busca do sistema usa esse filtro)
  • perda de desempenho para analisar e modificar o SQL do hibernate

Possibilidade2: usar algum recurso do hibernate semelhante filtros que funcione de forma dinâmica, me permitindo definir a regra do filtro em tempo de execução.
Probelmas: não conheço nenhum recurso do hibernate que me permita fazer isso…rs

Desde já agradeço e aceito sugestões para resolver este problema… rsrs

[quote=pcnandes]Possibilidade2: usar algum recurso do hibernate semelhante filtros que funcione de forma dinâmica, me permitindo definir a regra do filtro em tempo de execução.
Probelmas: não conheço nenhum recurso do hibernate que me permita fazer isso…rs[/quote]
Não conhece a API de Criteria?

tnaires, meu problema vai um pouco além disso… Eu preciso criar um módulo que faça isso independente do tipo de consulta feita pelo desenvolvedor… O desenvolvedor pode fazer suas consultas em hql, criteria, filtro ou até mesmo sql. e esse módulo mágico tem que incluir essa restrição na consulta dele… sacou? Por isso que estou tentando fazer com interceptor, pois com ele eu capturo o sql gerado pelo hibernate, mas alterar esse sql eh complicado e custoso para minha aplicação.

Pensei em fazer alguma coisa semelhante a anotação @Where(clause = “idUsuario=x”), mas preciso incluir essa expressão dinamicamente em tempo de execução entendeu? não sei como poderia fazer algo do tipo… :frowning:

Fala ai pessoal boa noite a todos !

Tive lendo sobre o Spring ele fala sobre interceptadores que são configurados em um xml.
esses interceptadores são disparados por classes e por métodos.
Sendo assim pode criar um interceptador dentro dos Dao`s ai vc insere alguns criterios e seja feliz !
Bom teoricamente e isso ai !

Mais como fazer na pratica eu nao sei !

Procura algo sobre Spring nesse modulo de interceptors !

Ajudou?

Valeussss !!!

Fala ae magnocosta, obrigado pela dica, dei uma olhada por alto e aparentemente teria como acionar um interceptor em um método (tenho que ver melhor como isso funciona), mas como eu poderia adicionar os critérios pelo interceptor? e se meu método fizer uma consulta por hql?

ex1.:
public List listar() {
return findHQL(“from Agencia order by numero”);
}

ex2.:
public PagedResult consultarPaginado(Long numero) {
return findCriteria(
HibernateUtil.getInstance().getSession().createCriteria(Agencia.class).
add(Restrictions.eq(“numero”, numero)), new Page(1));
}

obrigado.

pcnandes,

Como ja havia dito nao conheco Spring ainda estou estudando ele e nunca trabalhei com ele.
Bom mais pensei em uma gambi aki sinistra !
Testa ai para ver c funciona.

seu dao ficaria assim:

[code]
public class Dao {

public static Criteria criteria;

public List consultar(){
criteria = HibernateUtil.getInstance().getSession().createCriteria(Agencia.class);
criteria.add(Restrictions.eq(“numero”, numero));
//O interceptador deve executar aqui
criteria.list();
}
}[/code]

E na sua classe interceptor ficaria assim:

public class interceptor{

    public void intercptarConculta(){
       Criteria c = Dao.criteria;
       //Aki vc cria as restricoes que serao abstraidas
       c.addRestrictions(Restrictions.eq("acesso", 10)));

       Dao.criteria = criteria;
    }

}

Cara ta ai nao sei t dar certeza c vai funcionar, to na faculdade e to sem tempo para testar.
Agora tem que desenrolar no Spring para ele invocar a classe interceptarConsulta no método da classe Dao.

Obs: Se for possivel fazer isso com Spring, realmente ele eh sinistro.

Se der certo posta ai p galera !

Valewwsss !