2013-03-18 16 views
8

C'è un modo per definire una Spring Data Specification (restituendo un predicato JPA) il cui unico scopo è quello di eseguire il recupero appetitoso?Spring Data JPA Fetching

Ho un'entità che definisce varie relazioni utilizzando il caricamento lazy, ma ci sono diverse query in cui voglio restituire l'intera rappresentazione dell'entità includendo tutte le raccolte correlate, ma i criteri di queste query possono variare. Ho visto alcuni post (ad esempio sullo spring forum) che discutono la potenziale introduzione dei gruppi di recupero, che sarebbe probabilmente la soluzione ideale; tuttavia, poiché questo non fa ancora parte delle specifiche JPA, Spring Data non fornisce supporto per questo.

Sto cercando un modo riutilizzabile per eseguire il recupero avido su una varietà di query dinamiche.

Per esempio, ho considerato lo sviluppo di una specifica riutilizzabile il cui unico scopo è quello di eseguire l'eager loading, e che potrebbe essere combinata con altre specifiche, ad esempio:

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

    }; 
} 

L'obiettivo di questa specifica è quello di riutilizzarla in varie query, ad esempio:

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

Tuttavia, la specifica recupero ansiosi non è un vero predicato, quindi ritorna null, e provocherebbe evidenti problemi (cioè NullPointerExceptions) quando chaine d con altri predicati.

(Si noti che questo predicato solo funziona come previsto; vale a dire la seguente query correttamente prendere: repository.findAll(eager());).

Esiste un Predicato appropriato non nullo che può essere restituito dalla specifica "bisognosa" oppure esistono altri approcci riutilizzabili per l'attivazione di recuperi desiderosi utilizzando le specifiche JPA di Spring Data (senza dover applicare il carico desideroso su un'altra specifica)?

+0

Ricevo un'eccezione durante l'utilizzo dell'approccio: "query specificato unire il recupero, ma il proprietario dell'associazione scaricata non era presente nell'elenco di selezione". – svlada

+0

alternativamente, c'è un approccio come questo che potrebbe funzionare per rendere tutte le relazioni pigri? – chrismarx

risposta

6

Abbiamo migliorato la gestione di nullSpecification s e Predicate s nel corso del fixing DATAJPA-300. Si potrebbe desiderare di dare una prova alle istantanee 1.4 e vedere come questo influenza il tuo scenario.

+0

L'istantanea funziona perfettamente per il mio caso d'uso. Grazie! – shelley

+0

@Oliver Gierke Sei un fratello fantastico –

Problemi correlati