JPA规范DDD - 高级主题

时间:2012-03-28 10:19:12

标签: jpa domain-driven-design criteria specifications

最近我开发了一个项目,其中我使用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参数,构造函数......听起来不太好

1 个答案:

答案 0 :(得分:0)

听起来好像是多次调用join(A.b1),这会导致多个连接。要有一个连接,只需调用一次并重用该变量。