[RESOLVIDO] chamada Hibernate construida como string
8 respostas
S
siesler
Boa tarde pessoal.
Preciso preencher uma lista com clientes, a partir dos campos de consulta preenchidos na tela, para isso, estou construindo dinamicamente o comando session.createQuery do hibernate, como abaixo:
Stringquery="session.createQuery(select c from DlvClientes c where c.empresa.idEmpresa = :empresa)";Stringparametros=".setInt("+"\"empresa\""+",empresa.idEmpresa).list";
o problema, é que quando vou fazer a chamada da string construida, o java não o reconhece como comando, e critica que é requerido list e encontrado String:
Deixa eu ver se entendi, você quer rodar a query diversas vezes de acordo com o resultado de uma consulta, seria isso?
S
siesler
Não…
Quero construir o comando da query dinamicamente de acordo com os campos da tela de consulta.
no exemplo acima, estou usando somente o parametro empresa, mas tenho mais 4 parametros na tela.
Vou testar cada parametro e se ele não for nulo, incluo um novo trecho na query e um novo trecho no parametro, ao final, preciso executar o comando para popular o listCliente
O problema está no momento de gazer a chamada da string construida para popular a listClientes.
Att:
José Luiz
diogoprosoft
Cara eu fiz isso, mais não tem pq criar uma query na mão, vc pode pegar todos seus campos validar por em uma lista e mandar pro hibernate os parâmetros, ai vc só add os parâmetros que foram marcados pelo usuário, não pq vc fazer uma String, vc não terá como executar seu comando dessa maneira
S
siesler
Vc tem algum exemplo de como faço isso?
diogoprosoft
Segue um exemplo para vc meditar e ver se lhe serve
/***Estemétodoserveparapassarparâmetrosparaaquery,podemserpassadosquantosparâmetrosfornecessário,bastapassarumarrayparaométodo.*@paramparametros-Passarumarraydeobjetos.*Posições:*Naposição0devepassarastringcomosql,ex.:"SELECT t FROM Teste WHERE t.codigo = :codigo"*Naposição1devepassarastringcomonomedoparâmetro,ex.:"codigo"*Naposição2devepassaroparâmetroindependentedotipo,ex.:1500*Nasdemaisposiçõesdevemseguirospassos1e2semprenessasequênciadeixandoapenasaposição0comosql.*ArrayListarray=newArrayList();*array.add(0,"SELECT t FROM Teste WHERE t.codigo = :codigo");*array.add(1,"codigo");*array.add(2,1500);*@return*@throwsException*/@SuppressWarnings("unchecked")publicList<T>executeHql(ArrayList<T>parametros)throwsException{try{Queryq=session.createQuery(parametros.get(0).toString());for(inti=1;i<parametros.size();i++){q.setParameter(parametros.get(i).toString(),parametros.get(i+1));i++;}returnq.list();}catch(Exceptione){thrownewException(e);}finally{session.close();}}
S
siesler
Obrigado Diogo
vou fazer uns testes aqui e posto o código final
Att:
José Luiz
S
siesler
Diogo, obrigado!
Fiz algumas adaptações no meu método e funcionou em conjunto com seu exemplo. Vejam abaixo o código final
publicvoidlistCliente(){ArrayListarray=newArrayList();// seta i = 1, pois o 0 (zero) do array é a queryinti=1;Stringquery;query="select c from DlvClientes c WHERE c.empresa.idEmpresa = :idEmpresa ";array.add(0,query);// seta os parametro empresaarray.add(i,"idEmpresa");i++;System.out.println("ClientesBean:listCliente() - incluiu array posição 1");array.add(i,empresa.getIdEmpresa());// sesta os parametros da tela, se houverif(telefone!=0){// inclui na query a chamada do parametro da telaquery=(query+"and telefone = :telefone ");array.set(0,query);// seta o parametroi++;array.add(i,"telefone");i++;array.add(i,telefone);}if(!"".equals(nome)){StringnomeLike="%"+nome+"%";query=(query+"and nome like :nome ");array.set(0,query);i++;array.add(i,"nome");i++;array.add(i,nomeLike);}if(cpfCnpj!=0){query=(query+"and cpfCnpj = :cpfCnpj ");array.set(0,query);i++;array.add(i,"cpfCnpj");i++;array.add(i,cpfCnpj);}// inclui na query a ordenaçãoquery=(query+"order by nome");array.set(0,query);// popula listClientes chamando o metodo executeHqltry{listClientes=executeHql(array);}catch(Exceptionex){Logger.getLogger(ClientesBean.class.getName()).log(Level.SEVERE,null,ex);}}/** * Este método serve para passar parâmetros para a query, podem ser passados quantos parâmetros for necessário, basta passar um array para o método. * @param parametros - Passar um array de objetos. * Posições: * Na posição 0 deve passar a string com o sql, ex.: "SELECT t FROM Teste WHERE t.codigo = :codigo" * Na posição 1 deve passar a string com o nome do parâmetro, ex.: "codigo" * Na posição 2 deve passar o parâmetro independente do tipo, ex.: 1500 * Nas demais posições devem seguir os passos 1 e 2 sempre nessa sequência deixando apenas a posição 0 com o sql. * ArrayList array = new ArrayList(); * array.add(0,"SELECT t FROM Teste WHERE t.codigo = :codigo"); * array.add(1,"codigo"); * array.add(2,1500); * @return * @throws Exception */@SuppressWarnings("unchecked")publicList<DlvClientes>executeHql(ArrayList<String>parametros)throwsException{try{Queryq=session.createQuery(parametros.get(0).toString());for(inti=1;i<parametros.size();i++){q.setParameter(parametros.get(i).toString(),parametros.get(i+1));i++;}returnq.list();}catch(Exceptione){thrownewException(e);}finally{session.close();}}
Na pagina de consulta, chamo o metodo listCliente e funciona direitinho
diogoprosoft
Show de bola, fico feliz em poder ajudar
Sempre que precisar o GUJ tha ai