Um Tribunal de Justiça mantém uma consulta pública em Spring...

Próximas questões
Com base no mesmo assunto
Q4240106 Programação
Um Tribunal de Justiça mantém uma consulta pública em Spring Boot que lista milhares de processos filtrados por classe, comarca e situação. A tela exibe número, órgão julgador, classe, data de distribuição e última movimentação, mas a atualização recente elevou a latência por navegação em associações tardias. Considerando JPA/Hibernate e a necessidade de evitar materialização desnecessária do grafo de entidades, a solução tecnicamente correta é
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Gabarito: B

Fundamento decisivo: A decisão estava em perceber que a tela exibe apenas alguns campos e que o enunciado pede evitar a materialização desnecessária do grafo de entidades; nesse cenário, a alternativa correta é a que consulta somente os dados necessários.

Tema central: Projeção DTO em leitura
Análise das alternativas
A
Errada
Está errada porque @BatchSize pode reduzir a quantidade de consultas em alguns casos, mas a própria alternativa afirma retornar o grafo completo de cada processo. Isso contraria o requisito central da questão, que é evitar materialização desnecessária e trazer apenas o necessário para a tela.
B
Certa
A alternativa B está correta porque usa projeção DTO apenas com os campos da tela, em vez de carregar entidades completas com suas associações. Como a listagem mostra número, órgão julgador, classe, data de distribuição e última movimentação, a consulta deve buscar exatamente esses dados, inclusive obtendo a última movimentação na própria consulta, para evitar navegação lazy e o carregamento desnecessário do grafo de entidades.
C
Errada
Está errada porque desloca o problema para uma substituição arquitetural ampla e desnecessária, inclusive mencionando updates em um cenário descrito como de leitura/listagem. A questão pedia a solução técnica adequada dentro do contexto de JPA/Hibernate para consulta de leitura, não a troca generalizada por JDBC.
D
Errada
Está errada porque aplicar JOIN FETCH em movimentações, partes, documentos e assuntos expande fortemente o grafo carregado. Isso vai na direção oposta do enunciado, que exige evitar materialização desnecessária, além de continuar tratando o problema como carregamento de entidades e associações, e não como consulta enxuta de exibição.
E
Errada
Está errada porque cache de segundo nível pode ajudar na reutilização de entidades, mas não corrige o problema estrutural de uma listagem que continua buscando mais objetos do que a tela precisa. Cache não substitui uma consulta modelada para trazer só os campos necessários.
Pegadinha da questão
A confusão explorada foi tratar qualquer problema de lazy loading como caso para JOIN FETCH, batch ou cache, quando o enunciado pedia algo mais específico: uma leitura enxuta que evitasse carregar o grafo de entidades.
Dica para questões semelhantes
  • Se a consulta é de listagem e a tela mostra poucos campos, prefira projeção DTO em vez de entidades completas.
  • Reduzir número de consultas não basta se a solução ainda materializa associações que a tela não usa.
  • Quando apenas um dado derivado de uma coleção é exibido, obtenha-o na própria consulta em vez de carregar a coleção inteira.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Gabarito (E)

DTO e projeção são conceitos diferentes, mas podem ser utilizados em conjunto para melhorar a performance de consultas em bancos de dados relacionais.

DTO (Data Transfer Object) é um padrão de projeto utilizado para transferir dados entre diferentes camadas de uma aplicação. Ele é útil quando precisamos selecionar somente alguns atributos de uma entidade e transferi-los para outra camada da aplicação.

Já a projeção é uma técnica utilizada para selecionar somente alguns atributos de uma entidade em uma consulta. Ela pode ser utilizada para melhorar a performance de consultas em bancos de dados relacionais, já que selecionar somente os atributos necessários pode reduzir o tempo de resposta da consulta.

Portanto, a escolha entre utilizar projeção ou DTO depende do contexto da sua aplicação e das suas necessidades específicas. Se você precisa transferir dados entre camadas da sua aplicação, o DTO é uma boa opção. Já se você precisa melhorar a performance de consultas em bancos de dados relacionais, a projeção pode ser uma técnica útil.

Fonte: https://cursos.alura.com.br/forum/topico-dto-vs-projecao-206545

Não entendi a questão na primeira vez que a vi, so depois de errar percebi o que ela quer. A questão diz, na parte "a atualização recente elevou a latência por navegação em associações tardias." que a tabela Processo possui entidades associadas a ela, como por exemplo: Partes e Documentos, e ao selecionar ela, acaba selecionando as outras tabelas associadas a ela.

Ou seja, se você tiver 1.000 resultados de Processos, você terá na realidade 3.000 ( dado arbitrário para facilitar o exemplo ), pois serão 1.000 de Partes + 1.000 de Documentos + 1.000 de Processos ( o famoso N+1 queries )

Assim, uma solução seria criar um DTO para filtrar apenas o campos necessários e resolver o problema da N+1 queiries.

"Ao criar um DTO que contenha apenas as informações necessárias, você pode evitar o carregamento de associações desnecessárias. Essa abordagem é particularmente útil quando você precisa buscar um subconjunto de dados ou quando os relacionamentos são complexos." (exatamente o que a questão pede)

Esse artigo explica direitinho: https://medium.com/@kiarash.shamaii/what-is-n-1-query-generate-problem-in-spring-data-jpa-and-how-to-solve-it-2f3b9f1a7a0b

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo