Шаблон спецификации и специфический Hibernate-запрос - PullRequest
0 голосов
/ 06 января 2010

У меня вопрос, когда использовать шаблон спецификации, а когда использовать конкретный запрос 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

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

Ответы [ 3 ]

1 голос
/ 06 января 2010

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

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

0 голосов
/ 07 января 2010

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

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

0 голосов
/ 06 января 2010

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

...