Недавно я разработал проект, в котором я использую спецификацию 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 по всей спецификации .... как? По параметру, по конструктору ... Звучит не очень хорошо