[RESOLVIDO] Dúvidas de como usar SUM ao invés do laço "For"

Considerem os seguinte exemplo:

[code]
public class Carro {

String nome;
Integer totalKm;
List<Km> listaKm;

//construtor, getter e setters... 

public Integer getTotalKm() {
	for (Km k : listaKm) {
		totalKm = totalKm + km.getKmDia();
	}
	return totalKm;
}

}

public class Km {

Date data;
Integer kmDia;
Carro carro;

//construtor, getter e setters... 

}

public class MbCarro {

public void imprimirTotalKm() {
	System.out.println("Quantidade KM = " + carro.getTotalKm());			
}

}[/code]

Imagine que eu quero imprimir a quantidade total de km que meu carro rodou.
1 Solução: Eu posso fazer igual expliquei no exemplo. No “getTotalKm()” faço um for e vou somando a quantidade KmDia, pois o JPA vai carregar a lista de km com lazy. Isso já resolveria.

2 Solução: Eu posso via uma consulta no banco (SELECT SUM(k.kmDia) FROM Km k WHERE k.carro = :parametro) no qual já me retornaria a quantidade somada sem eu precisar fazer um for, ganhando performance.

Porém minha dúvida é a seguinte:
Supondo que eu opte pela solução do “select”, qual seria o lugar mais “correto” para fazer essa busca, sendo que não posso colocar o DAO dentro do meu getTotalKm(), pois iria ferir minha camada já que não utilizo o padrão Repository.

Alguém tem uma ideia ?

o “ganho performance” é certo? vc fez um benchmark?

Agora olhando para os seus objetos… pq vc tem uma lista diaria de km?

Por exemplo, vc esta guardando deltas do seu percurso e a soma de tudo é a kilometragem total. E se vc guardasse o valor total daquele dia? A kilometragem total seria a ultima kilometragem anotada e para saber quanto vc andou no mes bastaria subtrair valores.

jan 1 -> 0
jan 15 -> 100
jan 31 -> 178
fev 1 -> 188
fev 15 -> 200
fev 28 -> 330

quanto andou em janeiro? 178
quanto andou em fevereiro? 330 - 178
quanto andou no total? 330

as vezes a modelagem pode te ajudar. perceba que se vc quer saber exatamente quanto andou 1 de fevereiro? 188 -178 = 10 km.

Olá peczenyj.

A sua ideia também resolveria. Porém a minha dúvida estava voltada para qual seria a melhor forma usar a 2º solução (select).
Acabei resolvendo aqui com uma “junção” as duas, pois precisava usar a 2º solução por padrões da empresa.

Enfim, obrigado pela dica.