[RESOLVIDO] chamada Hibernate construida como string

8 respostas
S

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:

String query = "session.createQuery(select c from DlvClientes c where c.empresa.idEmpresa = :empresa)";
String parametros = ".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:

listClientes = (List<DlvClientes>) query + parametros;

Sabem como fazer?

Att:
José Luiz

8 Respostas

diogoprosoft

Deixa eu ver se entendi, você quer rodar a query diversas vezes de acordo com o resultado de uma consulta, seria isso?

S

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

Vc tem algum exemplo de como faço isso?

diogoprosoft

Segue um exemplo para vc meditar e ver se lhe serve

/**
	 * 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")
	public List<T> executeHql(ArrayList<T> parametros)throws Exception{
		try{
			Query q = session.createQuery(parametros.get(0).toString());
			for(int i=1; i < parametros.size(); i++){
				q.setParameter(parametros.get(i).toString(), parametros.get(i+1));
				i++;
			}
		return q.list();
		}catch(Exception e){
			throw new Exception(e);
		}finally{
			session.close();
		}
	}
S

Obrigado Diogo

vou fazer uns testes aqui e posto o código final

Att:
José Luiz

S

Diogo, obrigado!

Fiz algumas adaptações no meu método e funcionou em conjunto com seu exemplo. Vejam abaixo o código final

public void listCliente() {
        ArrayList array = new ArrayList();
        // seta i = 1, pois o 0 (zero) do array é a query
        int i = 1;
        String query;
        query = "select c from DlvClientes c WHERE c.empresa.idEmpresa = :idEmpresa "; 
        array.add(0, query);
        // seta os parametro empresa
        array.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 houver
        if (telefone != 0) {
            // inclui na query a chamada do parametro da tela
            query = (query + "and telefone = :telefone ");
            array.set(0, query);
            // seta o parametro
            i++;
            array.add(i,"telefone");
            i++;
            array.add(i,telefone);
        } if (!"".equals(nome)) {
            String nomeLike = "%" + 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ção
        query = (query + "order by nome");
        array.set(0, query);
        // popula listClientes chamando o metodo executeHql
        try {
            listClientes = executeHql(array);
        } catch (Exception ex) {
            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")  
    public List<DlvClientes> executeHql(ArrayList<String> parametros)throws Exception{  
        try{  
            Query q = session.createQuery(parametros.get(0).toString());  
            for(int i=1; i < parametros.size(); i++){
                q.setParameter(parametros.get(i).toString(), parametros.get(i+1));  
                i++;  
            }  
        return q.list();  
        }catch(Exception e){  
            throw new Exception(e);  
        }finally{  
            session.close();  
        }  
    }

Na pagina de consulta, chamo o metodo listCliente e funciona direitinho

diogoprosoft

Show de bola, fico feliz em poder ajudar :smiley:
Sempre que precisar o GUJ tha ai

Criado 25 de março de 2013
Ultima resposta 26 de mar. de 2013
Respostas 8
Participantes 2