2013-03-18 21 views
8

Czy istnieje sposób zdefiniowania Specyfikacji danych sprężynowych (zwracających predykat JPA), której jedynym celem jest wykonywanie szybkiego pobierania?Dane wiosenne JPA Pobieranie

Mam podmiot, który definiuje różne relacje przy użyciu leniwego ładowania, ale istnieje kilka kwerend, w których chcę zwrócić całą reprezentację encji, w tym wszystkie powiązane kolekcje, ale kryteria tych zapytań mogą być różne. Widziałem kilka postów (np. Na temat spring forum), które omawiają potencjalne wprowadzenie grup pobierania, które prawdopodobnie byłyby idealnym rozwiązaniem; Jednak ponieważ nie jest to jeszcze częścią specyfikacji JPA, Spring Data nie zapewnia jej wsparcia.

Poszukuję sposobu wielokrotnego użytku, aby wykonać szybkie pobieranie na różnych dynamicznych zapytaniach.

Na przykład, ja już za opracowanie specyfikacji wielokrotnego użytku, którego jedynym celem jest wykonać zachłanne ładowanie, a które mogą być łączone z innymi specyfikacjami, np:

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

    }; 
} 

Celem niniejszej specyfikacji jest używać go w różnych pytań, np:

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

jednak chętny specyfikacja pobierania nie jest prawdziwym orzecznikiem, więc zwraca null i spowodowałaby oczywiste problemy (tzn NullPointerExceptions) gdy chaine d z innymi predykatami.

(Należy pamiętać, że ten predykat sam działa zgodnie z oczekiwaniami, tj. Następujące zapytanie poprawnie pobierze: repository.findAll(eager());).

Czy istnieje odpowiedni nieprzedstawiony predykat, który może zostać zwrócony ze specyfikacji "skwapliwej", czy też istnieją inne podejścia wielokrotnego użytku do wyzwalania chętnych pobrań przy użyciu specyfikacji Spring Data JPA (bez konieczności przyklejania zbytniego obciążenia do innej specyfikacji)?

+0

Otrzymuję następujący wyjątek podczas korzystania z Twojego podejścia: "zapytanie o łączenie pobierania, ale właściciel pobranego powiązania nie był obecny na liście wyboru". – svlada

+0

alternatywnie, czy istnieje takie podejście, które sprawi, że wszystkie relacje będą leniwe? – chrismarx

Odpowiedz

6

Ulepszyliśmy obsługę null s oraz Predicate s w trakcie naprawy DATAJPA-300. Możesz chcieć dać 1.4 migawki i zobaczyć, jak to wpływa na twój scenariusz.

+0

Migawka działa doskonale w moim przypadku użycia. Dzięki! – shelley

+0

@Oliver Gierke Jesteś wspaniałym bratem –

Powiązane problemy