HQL Dinâmico

4 respostas
C

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…

4 Respostas

L

Como assim dinâmica?

Não entendi muito bem o seu problema… mas isto de colocar o HQL em um arquivo de properties… utilize Named Queries do Hibernate.

http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-querying-executing-named

[]s
Lucas Balensiefer

leomc

no seu caso seria mais interessante utilizar criteria query

C

Senhores,
Eu já utilizo Criteria queries, sendo que nesse exemplo eu não consigo montar um HQL padrão, tipo: select ordem from br.projeto.ordem where codOrdem = ?.
Eu monto isso numa classe dinamicamente, inicializo uma string com o select basico:

String selecao = “select ordem from br.projeto.ordem”;

Após crio uma outra string para ir armazenando as clausulas where, join… conforme a seleção do usuario no cliente (um jsp com campos que irão delimitar minha busca).

Gostaria de saber se tem como implementar isso de outra forma.

L

Utilizando a Criteria, você terá uma melhor implementação disto.

Ao invés de ficar manipulando Strings, você terá a sua Criteria básica e vai adicionando deste objeto Restrictions.

Exemplinho bobo:

Criteria crit = session.createCriteria(MyClass.class);

if(x&gt;y) {
  crit .add( Restrictions.eq("valor", x) );
} else {
  crit .add( Restrictions.eq("valor", y) );
}

Collection results = crit.list();

[]s
Lucas Balensiefer

Criado 30 de março de 2006
Ultima resposta 30 de mar. de 2006
Respostas 4
Participantes 3