Pergunta de entrevista para Desenvolvedor Java

Seu endpoint dispara centenas de queries por requisição. Como isso acontece com JPA e como você corrige?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

Isso é o problema N mais um: uma query carrega as linhas pai, e aí tocar uma associação lazy em cada uma dispara outra query por linha. Corrija buscando a associação na mesma query com um join fetch ou um entity graph, definindo um batch fetch size para o Hibernate carregar associações em grupos, ou projetando direto num DTO com só as colunas de que você precisa. Mantenha as associações lazy por padrão e faça o fetch eager por caso de uso.

Por que os entrevistadores perguntam isso

É o bug de performance mais comum em aplicações Spring e Hibernate, então o entrevistador quer saber se você reconhece o padrão pelos logs e corrige sem deixar tudo eager. Eles querem ouvir que a estratégia de fetch pertence à query e não ao mapeamento, mais consciência dos problemas relacionados: inicialização lazy fora de uma sessão, open session in view, e produtos cartesianos ao juntar duas coleções.

Como estruturar sua resposta

  • Nomeie o padrão e explique o que dispara as queries extras.
  • Dê as correções em ordem: join fetch, entity graph, batch size, projeção.
  • Insista que os mapeamentos seguem lazy e as queries decidem o fetch.
  • Cite a detecção: logue o SQL ou assegure a contagem de queries em testes.

Exemplo de resposta

Exemplo falado, em primeira pessoa

É N mais um. Eu carrego uma página de pedidos numa query, aí o serializador toca order.getItems em cada um, e como a associação é lazy o Hibernate volta ao banco para cada pedido. Vinte pedidos viram vinte e uma queries, e isso só aparece com dados reais. A primeira correção é buscar o que eu preciso de uma vez, seja uma query com join fetch ou um entity graph nomeado no método do repositório, para que os itens venham junto com os pais. Se eu preciso de duas coleções separadas eu não junto as duas, porque isso multiplica linhas num produto cartesiano; em vez disso eu defino um batch fetch size para o Hibernate carregar em lotes de, digamos, cinquenta com uma cláusula in, o que dá duas queries em vez de cem. Muitas vezes a resposta real é que o endpoint não precisa de entidades, então eu projeto direto num DTO só com as colunas necessárias. O que eu não faço é trocar o mapeamento para eager, porque isso conserta um endpoint e deixa todos os outros mais lentos. Eu mantenho a coisa honesta assegurando contagens de query num teste de integração.

Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.

Veja como funciona

Perguntas de acompanhamento que você pode esperar

  • O que é uma LazyInitializationException e como você a evita de forma adequada?
  • Por que open session in view é considerado prejudicial?
  • Como você pagina uma query que também faz join fetch de uma coleção?

Mais perguntas para Desenvolvedor Java

Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.

Prever minhas perguntas

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot