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.

Foi útil?

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 ^^?)

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