Dado o modelo de domínio a seguir, quero carregar todos os Answers, incluindo seus Values e seus respectivos sub-filhos, e colocá-los em um AnswerDTOpara depois converter para JSON. Eu tenho uma solução funcional, mas ela sofre com o problema N + 1 do qual quero me livrar usando um ad-hoc @EntityGraph. Todas as associações estão configuradas LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Usando um ad-hoc @EntityGraphno Repositorymétodo, posso garantir que os valores sejam pré-buscados para impedir N + 1 na Answer->Valueassociação. Enquanto meu resultado é bom, há outro problema N + 1, devido ao carregamento lento da selectedassociação dos MCValues.
Usando isto
@EntityGraph(attributePaths = {"value.selected"})
falha, porque o selectedcampo é obviamente apenas parte de algumas das Valueentidades:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Como posso dizer à JPA que apenas tente buscar a selectedassociação caso o valor seja a MCValue? Eu preciso de algo parecido optionalAttributePaths.

selectedas respostas que possuem aMCValue. Não gostava que isso exigisse um loop adicional e precisaria gerenciar o mapeamento entre os conjuntos de dados. Gosto da sua ideia de explorar o cache do Hibernate para isso. Você pode explicar como é seguro (em termos de consistência) confiar no cache para conter os resultados? Isso funciona quando as consultas são feitas em uma transação? Eu tenho medo de erros de inicialização preguiçosos difíceis de detectar e esporádicos.