2012-03-28 26 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