Padrão de especificação versus consulta de hibernato específica
-
19-09-2019 - |
Pergunta
Minha pergunta é quando usar um padrão de especificação e quando usar consulta SQL específica.
Entendi que o padrão específico precisa coletar coleta inteira e postar filtro usando especificação de concreto. Mas não entendo a vantagem na frente de uma consulta SQL específica.
CarColorSpecification cc = new CarColorSpecification(RED);
CarAgeSpecification ca = new CarAgeSpecification(OLDER, 5);
ISpecification finalSpec = cc.And(ca);
List<Car> res;
List<Car> carColl = service.getCars();
foreach(Car c in carColl) {
if(finalSpec.isSatisfiedBy(c)) {
res.add(c);
}
}
E o mesmo em SQL / Hibernate
FROM Car c WHERE c.color = RED AND c.age > 5
Eu acho que depende do volume de dados processar.
Solução
o Repositório é usado para abstrair a implementação de persistência de suas classes de domínio. Em resumo, o SQL/HQL só deve existir em seus repositórios.
Se você estiver lidando com altos volumes de dados, crie um novo método em seu Repositório e chame esse método do seu Especificação.
Outras dicas
A versão SQL será executada rapidamente, desde que a tabela seja indexada adequadamente para as colunas em questão e seu tamanho, e transferirá um volume menor de dados entre o servidor DB e o servidor de aplicativos, se eles forem diferentes. No entanto, pode impor uma carga mais alta na caixa SQL em termos de CPU e uso de E/S de disco e, em muitos ambientes, o servidor DB é o componente mais caro para escalar.
Então, sim, depende muito do tamanho dos dados.
Eu acho que um bom compromisso seria combinar o padrão de especificação de acordo com o Hibernate para gerar consultas HQL. (Talvez Linq para Java ^^?)