Fala, Thales. Tudo bem contigo?
Tem um livro de Thorben Janssen (em inglês) qua aborda a sua dúvida em um tópico bem curto chamado Constructor references. Segue abaixo o trecho do porque de usarmos o Full Qualified Named
"As referências do construtor são uma boa projeção para casos de uso somente leitura. Eles são mais confortáveis de usar do que projeções de escalar e evitam a sobrecarga de entidades gerenciadas.
JPQL permite definir uma chamada de construtor na cláusula SELECT. Você só precisa fornecer o nome da classe totalmente qualificado e especificar os parâmetros do construtor de um construtor existente. Semelhante à projeção de entidade, o Hibernate gera uma consulta SQL que retorna as colunas do banco de dados necessárias e usa a referência do construtor para instanciar um novo objeto para cada registro no conjunto de resultados."
Veja que após incluirmos o @NamedQuery
na Classe Movimentacao
@NamedQuery(name="mediaDiariaMovimentacoes", query="select new br.com.alura.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data))" +
"from Movimentacao m group by day(m.data), month(m.data), year(m.data)")
não é mais necessário chamar novamente dentro do método. Basta invocarmos o mediaDiariaMovimentacoes
do @NamedQuery
public List<MediaComData> getMediaDiariaDasMovimentacoes() {
TypedQuery<MediaComData> query = em.createNamedQuery("mediaDiariaMovimentacoes", MediaComData.class);
return query.getResultList();
}
Espero ter contribuído, Thales!
Um abraço e bons estudos!