Biorąc pod uwagę następujący model domeny, chcę załadować wszystkie Answers, w tym ich Values i ich podrzędne, i umieścić go w, AnswerDTOaby następnie przekonwertować na JSON. Mam działające rozwiązanie, ale cierpi na problem N + 1, którego chcę się pozbyć za pomocą ad-hoc @EntityGraph. Wszystkie powiązania są skonfigurowane LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Używając metody ad-hoc @EntityGraphw Repositorymetodzie, mogę upewnić się, że wartości są wstępnie pobierane, aby zapobiec N + 1 w Answer->Valuepowiązaniu. Chociaż mój wynik jest w porządku, jest jeszcze jeden problem N + 1, z powodu leniwego ładowania selectedskojarzenia MCValues.
Za pomocą tego
@EntityGraph(attributePaths = {"value.selected"})
kończy się niepowodzeniem, ponieważ selectedpole jest oczywiście tylko częścią niektórych Valuepodmiotów:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Jak mogę powiedzieć WZP, że próbuje pobrać selectedpowiązanie tylko w przypadku, gdy jest to wartość MCValue? Potrzebuję czegoś takiego optionalAttributePaths.

selecteddla odpowiedzi, które mająMCValue. Nie podobało mi się, że wymagałoby to dodatkowej pętli i musiałem zarządzać mapowaniem między zestawami danych. Podoba mi się twój pomysł wykorzystania w tym celu pamięci podręcznej Hibernacji. Czy potrafisz wyjaśnić, na ile bezpieczne (pod względem spójności) jest poleganie na pamięci podręcznej w celu przechowywania wyników? Czy to działa, gdy zapytania są dokonywane w transakcji? Boję się trudnych do wykrycia i sporadycznych, leniwych błędów inicjalizacji.