2012-03-28 15 views
1

Kürzlich entwickelte ich ein Projekt, in dem ich DDD-Spezifikation verwenden, um mit JPA Prädikat:JPA-Spezifikation DDD - Advanced Thema

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(); 
} 

Ich habe 3 Einheiten 'A' und 'B' und 'C' mit diesen Beziehungen:
OneToMany A mit B
C OneToMany mit B

Dann habe ich eine Spezifikation für die Entität 'A' aber die Bedingungen sind mit Entität 'C' verbunden sind, so dass ich verbindet.

Alles ist in Ordnung, wenn es eine solche Spezifikation gibt, aber nicht, wenn es zwei davon gibt.

Wenn ich spec1.and(spec2).and(spec3).and(...) erhalte ich:

ORM-Abfrage erstellen:

select a 
from 
    A a, 
    B b1, 
    C c1, 
    B b2, 
    C c2, 
    ... 
where ... 

Wenn Sie mehr von dieser Art von Spezifikation and ed miteinander, diese wählen wird Alptraum JOINS, denn es sollte Verwenden Sie nur einen Join und wenden Sie ein Prädikat darauf an.

Meine Frage ist: Wie kann ich diese Joins weglassen?

Update: Frage ist, wie man Spezifikation zu entwerfen, um einzelnes Verbindungselement für alle Spezifikation in der Abfrage zu haben. Ich weiß, dass ich Variable wiederverwendet werden muss, ich brauche Verbreitung Objekt über die ganze Spezifikation zusammenfügen .... wie? nach Parameter, nach Konstruktor ... Es klingt nicht gut

Antwort

0

Es klingt, als ob Sie mehrere Male join(A.b1) aufrufen, und dies führt zu mehreren Joins. Um einen Join zu erhalten, rufen Sie ihn nur einmal auf und verwenden Sie die Variable erneut.

+0

Ok, ich habe mich nicht klar gemacht. Die Frage ist, wie man die Spezifikation so gestaltet, dass sie für alle Spezifikationen in der Abfrage ein einziges Join-Element enthält. Ich weiß, dass ich Variable wiederverwendet werden muss, ich brauche Verbreitung Objekt über die ganze Spezifikation zusammenfügen .... wie? nach Parameter, nach Konstruktor ... Es klingt nicht gut. Ich denke, dass Lösungen Containerspezifikationen für die Spezifikation für eine bestimmte Abfrage haben sollen, und dieses Objekt würde ein einzelnes Verknüpfungselement bereitstellen (oder ein neues erstellen), wenn eine Spezifikation erforderlich ist. – user1297783