Шаблон спецификации против конкретного запроса Гибернации

StackOverflow https://stackoverflow.com/questions/2015535

Вопрос

Мой вопрос заключается в том, когда использовать шаблон спецификации, а когда использовать конкретный SQL-запрос.

Я понял, что конкретному шаблону необходимо собрать всю коллекцию и опубликовать фильтр, используя конкретную спецификацию.Но я не понимаю преимущества перед конкретным SQL-запросом.

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);
  }
}

И то же самое в SQL / Hibernate

FROM Car c WHERE c.color = RED AND c.age > 5

Я думаю, это зависит от объема обрабатываемых данных.

Это было полезно?

Решение

В Хранилище используется для абстрагирования реализации персистентности от ваших доменных классов.Короче говоря, SQL / HQL должен существовать только в ваших репозиториях.

Если вы имеете дело с большими объемами данных, создайте новый метод на вашем Хранилище и вызовите этот метод из вашего Спецификация.

Другие советы

Версия SQL будет выполняться быстро при условии, что таблица соответствующим образом проиндексирована для рассматриваемых столбцов и ее размера, и она будет передавать меньший объем данных между сервером базы данных и сервером приложений, если они разные.Однако это может привести к более высокой нагрузке на блок SQL с точки зрения использования ЦП и дискового ввода-вывода, и во многих средах сервер БД является наиболее дорогостоящим компонентом для масштабирования.

Так что да, это во многом зависит от размера данных.

Я думаю, что хорошим компромиссом было бы объединить шаблон спецификации в соответствии с hibernate для генерации запросов HQL.(Может быть, Linq для Java ^^ ?)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top