Senhores,
Queria saber se alguém sabe uma maneira melhor de implementar um HQL dinâmico.
O padrão que utilizo é em um arquivo de propriedades criar o HQL:
GerenciaOrdemServico.properties
listaOrdemServicoOrdenadaPorNumero=\
select \
os.id_ordem_servico, os.id_conta, c.nm_conta, os.id_fornecedor, f.nm_fornecedor, a.total as totalItens, b.total as totalRateio \
from \
svp_ordem_servico os \
inner join \
svp_conta c on c.id_conta = os.id_conta \
inner join \
svp_fornecedor f on f.id_fornecedor = os.id_fornecedor \
left outer join \
(select ios.id_ordem_servico id, sum(ios.valor_item_ordem_servico) total from svp_item_ordem_servico ios group by ios.id_ordem_servico) as a on a.id = os.id_ordem_servico \
left outer join \
(select ros.id_ordem_servico id, sum(ros.valor_parcela) total from svp_rateio_ordem_servico ros group by ros.id_ordem_servico) as b on b.id = os.id_ordem_servico
E depois chamo esse código nas classes que irão validar as informações e passar como parâmetro, mas não consigo fazer isso com uma que será dinâmica. Segue abaixo:
String consulta = "select ordemServico from br.com.merck.svp.entidade.OrdemServico ordemServico ";
String wheres = "";
if(formulario.getDtFimFiltro() != null && !formulario.getDtFimFiltro().equals(""))
{
//Pega a Data Final do Filtro e altera o dia para o último dia do mês
dtFimFiltro = stringParaMesAnoSqlDate(formulario.getDtFimFiltro());
Calendar dtFim = Calendar.getInstance();
dtFim.setTime(dtFimFiltro);
dtFim.set(Calendar.DAY_OF_MONTH,dtFim.getActualMaximum(Calendar.DAY_OF_MONTH));
//Define a data inicial para a pesquisa no banco
Calendar dtInicio = Calendar.getInstance();
dtInicio.set(Calendar.YEAR, 1900);
//Monta a consulta
tipos.add(Hibernate.TIMESTAMP);
parametros.add(new Timestamp(dtFimFiltro.getTime()));
wheres += "where ordemServico.dataOrdemServico <= ? ";
//Flags
filtrosVazios = false;
primeiraCondicao = false;
//Logs
getLogger().debug("Executando Filtros por Data...");
getLogger().debug("Consulta com Filto data inicial VAZIO e Filtro data final PREENCHIDO...");
getLogger().debug("Data inicial: " + dtInicio.getTime());
getLogger().debug("Data Final: " + dtFimFiltro.getTime());
}
//Fim do Filtro por data (MM/AAAA)
}
Se alguém puder ajudar…