2012-03-28 58 views
1

最近我发展中,我使用DDD规范与JPA谓语项目:JPA规范DDD - 高级话题

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”与这些关系:
甲一对多与乙
ç一对多与乙

然后创建用于实体“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 ED相互的,这个选择成为噩梦连接,因为应该只能使用一个连接,并对其应用谓词。我的问题是: 如何省略这些连接?

更新: 问题是如何设计规范,使查询中的所有规范都具有单个Join元素。我知道我需要重用变量,我需要传播所有接口对象的规范....怎么样?通过参数,通过构造...它听起来不错

回答

0

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

+0

好吧,我没有让自己清楚。问题是如何为查询中的所有规范设计规范具有单一的Join元素。我知道我需要重用变量,我需要传播所有接口对象的规范....怎么样?通过参数,通过构造函数...它听起来不错。我认为解决方案是为特定查询指定容器的“指定”,并且此对象将根据需要提供单个联接元素(或创建新联接元素)。 – user1297783 2012-03-29 11:53:10