2013-03-18 17 views
8

Gibt es eine Möglichkeit, eine Spring Data Specification (Zurückgeben ein JPA Prädikats), deren einzigen Zweck zu definieren ist bestrebt Abruf durchführen?Spring Data JPA Fetching

Ich habe eine Entität, die verschiedene Beziehungen mit Lazy Loading definiert, aber es gibt mehrere Abfragen, bei denen ich die gesamte Entitätsdarstellung einschließlich aller verwandten Sammlungen zurückgeben möchte, aber die Kriterien dieser Abfragen können variieren. Ich habe ein paar Posts gesehen (z. B. auf der spring forum), die die mögliche Einführung von Abrufgruppen diskutieren, die wahrscheinlich die ideale Lösung wäre; Da dies jedoch noch nicht Teil der JPA-Spezifikation ist, bietet Spring Data keine Unterstützung dafür.

Ich bin für eine wiederverwendbare Art und Weise suchen eifrig auszuführen auf einer Vielzahl von dynamischen Abfragen abgerufen werden.

Zum Beispiel habe ich als eine wiederverwendbare Spezifikation, deren einziger Zweck der Entwicklung ist es, die eifrig Laden durchzuführen, und die mit anderen Spezifikationen kombiniert werden könnten, zum Beispiel:

private static Specification<MyEntity> eager() { 

    return new Specification<MyEntity>() { 

     @Override 
     public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      for (PluralAttribute<? super MyEntity, ?, ?> fetch : root.getModel().getPluralAttributes()) { 
       root.fetch(fetch, JoinType.LEFT); 
      } 
      query.distinct(true); 
      return null; 
     } 

    }; 
} 

Das Ziel dieser Spezifikation ist es, es in verschiedenen Abfragen Wiederverwendung, zum Beispiel:

repository.findAll(where(eager()).and(otherCriteria).or(otherCriteria)); 

jedoch die eifrig Abrufen Spezifikation kein echtes Prädikat ist, so ist es null zurückkehrt, und würde offensichtliche Probleme (dh NullPointerExceptions) verursachen, wenn chaine d mit anderen Prädikaten.

(Beachten Sie, dass dieses Prädikat allein funktioniert wie erwartet; d. H. Die folgende Abfrage wird ordnungsgemäß abrufen: repository.findAll(eager());).

Gibt es ein geeignetes Nicht-Null-Prädikat, das von der "eiager" -Spezifikation zurückgegeben werden kann, oder gibt es andere wiederverwendbare Ansätze zum Auslösen von Eager-Abrufen mithilfe von Spring Data JPA-Spezifikationen (ohne die Eager-Last einer anderen Spezifikation zuordnen zu müssen))

+0

Ich erhalte folgende Ausnahme, wenn Ihr Ansatz: „Abfrage angegeben join holen, aber der Besitzer des abgerufenen Vereins war in der Auswahlliste nicht vorhanden“. – svlada

+0

Oder gibt es einen solchen Ansatz, der alle Beziehungen faul machen würde? – chrismarx

Antwort

6

Wir haben den Umgang mit nullSpecification s und Predicate s im Laufe der Festsetzung DATAJPA-300 verbessert. Vielleicht möchten Sie die 1.4 Snapshots ausprobieren und sehen, wie sich dies auf Ihr Szenario auswirkt.

+0

Der Schnappschuss funktioniert perfekt für meinen Anwendungsfall. Vielen Dank! – shelley

+0

@Oliver Gierke Du bist ein großartiger Bruder –

Verwandte Themen