Java - Ibatis - mySQL com o Query dinâmico com base na função
-
19-08-2019 - |
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?
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.