Dado o modelo de domínio a seguir, quero carregar todos os Answer
s, incluindo seus Value
s e seus respectivos sub-filhos, e colocá-los em um AnswerDTO
para 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 @EntityGraph
no Repository
método, posso garantir que os valores sejam pré-buscados para impedir N + 1 na Answer->Value
associação. Enquanto meu resultado é bom, há outro problema N + 1, devido ao carregamento lento da selected
associação dos MCValue
s.
Usando isto
@EntityGraph(attributePaths = {"value.selected"})
falha, porque o selected
campo é obviamente apenas parte de algumas das Value
entidades:
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 selected
associação caso o valor seja a MCValue
? Eu preciso de algo parecido optionalAttributePaths
.
selected
as 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.