Шаблон спецификации против конкретного запроса Гибернации
-
19-09-2019 - |
Вопрос
Мой вопрос заключается в том, когда использовать шаблон спецификации, а когда использовать конкретный 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 ^^ ?)