JPA Спецификация DDD - Расширенная тема - PullRequest
1 голос
/ 28 марта 2012

Недавно я разработал проект, в котором я использую спецификацию DDD с предикатом JPA:

public interface Specification<T>{
  public boolean isSatisfiedBy(T object);
  Predicate toPredicate(Root<T> root, CriteriaQuery<T> cq, CriteriaBuilder cb);
  ISpecyfikacja<T> and(ISpecyfikacja<T> specyfikacja);
  ISpecyfikacja<T> or(ISpecyfikacja<T> specyfikacja);
  ISpecyfikacja<T> not();
}

У меня есть 3 сущности 'A' и 'B' и 'C' с этими отношениями:
OneToMany с B
C OneToMany с B

Затем я создал некоторую спецификацию для сущности 'A', но условия связаны с сущностью 'C', поэтому я сделал соединения.

root.join(A.b1).join(B.c1);

Все нормально, когда есть одна из таких спецификаций, но нет, если их две.

Когда я делаю spec1.and(spec2).and(spec3).and(...), я получаю:

ORM создать запрос:

select a
from 
  A a,
  B b1,
  C c1,
  B b2,
  C c2,
  ...
where ...

Если у вас есть больше спецификаций такого рода, and редактируемых друг с другом, этот выбор становится кошмарным СОЕДИНЕНИЕМ, поскольку следует использовать только одно соединение и применять к нему предикат.

Мой вопрос: Как мне пропустить эти объединения?

Обновление: Вопрос в том, как спроектировать спецификацию, чтобы иметь единственный элемент Join для всей спецификации в запросе. Я знаю, что мне нужно повторно использовать переменную, мне нужно распространить объект Join по всей спецификации .... как? По параметру, по конструктору ... Звучит не очень хорошо

1 Ответ

0 голосов
/ 28 марта 2012

Звучит так, как будто вы звоните join(A.b1) несколько раз, и это приведет к нескольким соединениям.Чтобы иметь одно соединение, вызовите его только один раз и повторно используйте переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...