Sum no hibernate?

2 respostas
P

Pessoal,

Estou com dúvidas, numa implementação, vou mostar o problema, vejam qual caminho é mais performático.

&gt&gtProblema&lt&lt

EntidadeA possui um List populado com EntidadeB (exemplo, tabela Pai e tabela Filho, 0…*)

Tenho que exibir o total gasto com mesado do(s) filho(s)

|Nome Pai| |Outros dados do Pai| |Total Gasto com mesada|

&gt&gtSoluções&lt&lt

1 - Posso carregar Pai e todos seus filhos, faço uma iteração na lista de filhos e vou somando a mesada.
2 - Coloco um atributo BigDecimal totalMesada no pai, antes de exibi-lo faço um HQL

select sum(mesada) from package.Filho as filho where filho.pai = pai

-------------//-------------//-------------//-------------

Tem outras sugestões? Qual é melhor?

2 Respostas

faroestecaboclo

cara… se as informações q vc quer são apenas essas aew:
|Nome Pai| |Outros dados do Pai| |Total Gasto com mesada|

e não precisa detalhar os filhos, então não tem pq buscá-los.
faça esse hql pra trazer so o q vc precisa,… de uma vez so.

se for d um Pai só, faça esse hql q vc mandou… se for todos os pais, com seus respectivos totais de mesada, faz o HQL usando group by.

select pai.nome, pai.idade, sum(filho.mesada) 
  from Pai pai
    left join pai.filhos filho
group by pai.nome, pai.idade

só usei o left join pra trazer tbm os casos q o pai não tem filhos. se não vc pode usar diretamente o join implicito:

select pai.nome, pai.idade, sum(pai.filhos.mesada) 
  from Pai pai
group by pai.nome, pai.idade

Isso vai retornar uma coleção de Objects[] (vetor mesmo), onde cada object vai ser: object[0] - nome do pai, object[1] - idade do pai e object[2] - soma das mesadas.

Se preferir, pode tb criar um Objeto pra armazenar esses valores. tipo, um MesadaVO. dae vc faz assim:

select new PACKAGE.MesadaVO(pai.nome, pai.idade, sum(filho.mesada)) 
  from Pai pai
    left join pai.filhos filho
group by pai.nome, pai.idade

q o hibernate retornará uma lista de MesadaVO instanciadas bunitinho.
nesse caso, claro, q vc terá q ter um construtor com esta assinatura q está usando no VO (String nome, int idade, BigDecimal mesada).

P

Animal cara, valeu pacas! Vou usar a opção do Left Join, atende perfeitamente. Não é necessária para o caso, mas achei legal o lance de dar new Object na instrução select!

Brigadão!

Criado 23 de agosto de 2006
Ultima resposta 23 de ago. de 2006
Respostas 2
Participantes 2