Problema n + 1 consultas

Estou com um problema de performance onde tenho 10 carros alugados e preciso popular um gráfico de linhas com esses 10 carros no entanto está demorando muito tempo para abrir a tela. Segue a lógica que utilizei para fazer Teria uma maneira de melhorar esse código para a tela abrir mais rápido pois, e complicado para o usuário ter que esperar mais de 4 minutos para a tela abrir. Ao abrir a tela e feita a consulta 10 vezes (primeiro for de carros) e mais 200 consultas dentro do while Qual seria a melhor solução para esse problema?

public List<CarroVO> carrosAlugadosPorMes() {

List<CarroVO> listaCarrosAlugados = new ArrayList<>();
List<LinkedHashMap<String, List>> carrosAlugados = mapCarros();

// obterCarrosAlugados = id = marcaCarro 
for (LinkedHashMap carroAlugado : carrosAlugados) {

LinkedHashMap<String, Integer> carroMesTotal = new LinkedHashMap<>();
LocalDate dataAtual = LocalDate.now();
LocalDate ultimoMes = dataAtual.minusMonths(11);
LocalDate mesBalanco = LocalDate.of(ultimoMes.getYear(),
ultimoMes.getMonth(), ultimoMes.getMonth().length(ultimoMes.isLeapYear()));
LocalDate ultimoDiaMes = LocalDate.of(dataAtual.getYear(), dataAtual.getMonth(),
dataAtual.getMonth().length(dataAtual.isLeapYear()));

while ( mesBalanco.isBefore(ultimoDiaMes) ||
mesBalanco.isEqual(ultimoDiaMes)) {

Month mes = mesBalanco.getMonth();
String noMesAtual = mes.getDisplayName(TextStyle.SHORT, new Locale("pt", "BR"));
int numeroDias = mes.length(mesBalanco.isLeapYear());
Calendar calendar = ultimoDiaMes(mesBalanco.getYear(), mesBalanco.getMonthValue(), numeroDias);
//Aqui faz a consulta para popular o gráfico de linhas onde utilizo nativeQuery contendo duas pesquisas uma para tipo 1 de carro e outra para o tipo 2 de carro 
Integer totalCarros = carroDao.consultaBanco(calendar, new ArrayList( carroAlugado.values() ));

carroMesTotal.put(noMesAtual, totalCarros);

mesBalanco = mesBalanco.plusMonths(1);
}

CarroVO carroVO = new CarroVO();
carroAlugado.forEach((k,v) -> carroVO.setMarcaCarro(k.toString()) );
List<LinkedHashMap<String, Integer>> totalCarros = new ArrayList<>();
totalCarros.add(carroMesTotal);
carroVO.setTotalCarro(totalCarros);
listaCarrosAlugados.add(carroVO);
}

return listaCarrosAlugados;
}

Faz uma única query via SQL, trazendo todos os dados necessários pra essa consulta através de joins. Joga esse resultset direto em um DTO e assim pode trabalhar a vontade com os dados usando Stream/Filter do Java. Ficará bem rápido se tiver usando índices claro.

O problema são as datas que pega na consulta bem como esses ids
tem duas condições
Ou o carro e de locadora ou de pessoa física.
Numa consulta mostro os carros de uma locadora e no outra os carros de pessoa física.
Teria como me ajudar se enviar o sql que está fazendo?

Se sao filtros que o usuário escolhe, no SQL seriam parâmetros do where.

FIz um union nas duas consultas como faço para popular o dto com os dados?
Teria um exemplo?