Pergunta

Eu estou usando Java - Ibatis e mySQL com Flex / Flash no front-end. Eu tenho um requisito que deve ser capaz de adicionar dinamicamente creterias e mesa para uma consulta, dependendo da função do usuário. aqui está um exemplo

O mesmo objeto chamando mesmo SQL, mas resultado diferente com base na função

Papel 1: Totalmente Acesso aos funcionários

SELECT * 
  FROM Employee A

Função 2: O acesso limitado aos funcionários

SELECT * 
 FROM Employee A
    , SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
  AND B.ROLE_ID = 'ROLE'

Eu poderia usar o Dynamic SQL

    SELECT * 
     FROM Employee A
<isNotEmpty property="ROLE" >
        , SECURE_LIST B
    WHERE B.EmployeeID = A.EmployeeID
      AND B.ROLE_ID = #ROLE#
</isNotEmpty>

Outras idéias?

Foi útil?

Solução

SELECT *      
FROM Employee A
<isNotEmpty property="ROLE" >
   inner join SECURE_LIST B on B.EmployeeID = A.EmployeeID
</isNotEmpty>
<dynamic prepend="WHERE">
      <isNotEmpty property="ROLE" prepend="AND">
           B.ROLE_ID = #ROLE#
      </isNotEmpty>
</dynamic>

Um pouco mais simples do que a criação de DAOs mas ainda proporcionando-lhe a flexibilidade de adicionar outras associações ou outro em que elementos cláusula sem ter que incluem papel em cada mapa de parâmetro

Outras dicas

O problema com o uso de papel dentro da consulta é que você tem que, em seguida, fornecê-lo como um argumento para a consulta para, possivelmente, cada consulta. O que acontece quando você precisa de argumentos de fornecimento para a consulta? Você vai precisar adicionar papel a essas classes de parâmetros / Mapas também. É tudo um pouco confuso.

Eu tomaria um passo para trás e definir o seu DAO:

public interface MyDAO {
  List<Employee> getEmployees();
  ...
}

e, em seguida, criar duas implementações:

public class MyDAOSuper implements MyDAO {
  public List<Employee> getEmployees() {
    // call a query using your first SQL
  }
}

public class MyDAOLimited implements MyDAO {
  public List<Employee> getEmployees() {
    // limited version
  }
}

Uma vantagem dessa abordagem é que, se determinados métodos não deve ser usado por um papel particular você tem a opção de lançar alguma exceção violação de segurança.

Agora, como você conectar que para o resto de sua aplicação é algo que eu não tenho detalhes suficientes para comentar. Você pode estar usando BlazeDS caso em que eu sugiro usar o integração Primavera com BlazeDS , que vai abrir a injeção de dependência como uma opção.

Como alternativa, você poderia usar um método de fábrica simples (com base em papel) para obter o DAO correto.

Existem, sem dúvida, outras maneiras de ligar este no, dependendo da sua configuração. Eu acho que o acima é muito mais limpo do que o que você está propondo embora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top