最近我开发了一个项目,其中我使用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'具有这些关系:
aToMany与B
C oneToMany with 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
,则此选择将成为噩梦JOINS,因为应该只使用一个连接,并将谓词应用于它。
我的问题是: 如何省略这些连接?
更新 问题是如何在查询中为所有规范设计规范以具有单个Join元素。我知道我需要重用变量,我需要传播整个规范的Join对象....怎么样? by参数,构造函数......听起来不太好
答案 0 :(得分:0)
听起来好像是多次调用join(A.b1)
,这会导致多个连接。要有一个连接,只需调用一次并重用该变量。