JPA - CreateQuery não retornam dados [RESOLVIDO]

11 respostas
gsfteodoro

Bom dia!

Vai mais uma dúvida.
Uso no meu projeto JPA 1.0.
Por algumas limitações dele, estou fazendo alguns métodos para busca de acordo com um objeto de exemplo. Imagino que isso o Hibernate faça.
Pois bem, quando eu executo o método createQuery().

O método que chamo é o lista(T t). O retorno é null, de nenhum dado encontrado.
Se eu executo a query que o JPA me mostra ( devido a configuração ""), me mostra a query montada adequadamente com o "?" no lugar dos parâmetros.

Segue o meu código:
public List<T> lista(String where, LinkedList<Object> params) 
    {
        String[] aux = where.replace("?", "§").split("§");
        String w = aux[0];
        for (int i = 1 ; i < aux.length ; i ++)
        {
            w += " :param" + String.valueOf(i) + " " + aux[i];
        }
        Query q = this.em.createQuery(w);
        
        for (int i = 0 ; i < params.size() ; i ++)
        {
            System.out.println("param"+String.valueOf(i+1)+" = " + params.get(i));
            q.setParameter("param" + String.valueOf(i+1), params.get(i));
        }
        return (List<T>) q.getResultList();
    }
    
    @Override
    public List<T> lista (T t){
        
        AuxJpa<T> aux = new AuxJpa<T>();
        String comando = aux.getWhere(t);
        return lista("from " + classe.getName() + " t " + (!comando.isEmpty()?"where ": "") + comando,aux.getParams());
    }
A classe AuxJpa interna está assim:
class AuxJpa<T>{
    
    private LinkedList<Object> params = new LinkedList<Object>();
    
    public LinkedList<Object> getParams()
    {
        return this.params;
    }
    
    public String getWhere(T t)
    {
        String ret = "";
        Method[] metodos = t.getClass().getDeclaredMethods();
        
        for (Method m : metodos)
        {
            if (m.getName().startsWith("get") || m.getName().startsWith("is")) 
            {
                ret += getValor(m,t) + (getValor(m,t).equals("") ?"":" AND ");
                continue;
            }
        }        
        return ret.substring(0,ret.length()-4);
    }
    
    private String getValor(Method m, T t)
    {
        
        String ret = "";
        try 
        {
            if (m.invoke(t, null)==null) return ret;
            if (params.isEmpty() || !params.get(params.size()-1).equals(m.invoke(t, null)))
            {
                params.add(m.invoke(t, null));
            }
            
            for (Field f : t.getClass().getDeclaredFields())
            {
                if (m.getName().substring(m.getName().startsWith("get")?3:2).toLowerCase().equals(f.getName().toLowerCase()))
                {
                    ret = f.getName() + " = ? ";
                    continue;
                }                    
            }
        }
        catch (IllegalAccessException ex) 
        {
            System.out.println(ex.getMessage());
        }
        catch (IllegalArgumentException ex) 
        {
            System.out.println(ex.getMessage());
        }
        catch (InvocationTargetException ex) 
        {
            System.out.println(ex.getMessage());
        }
        return ret;
    }
}

11 Respostas

A

cara,

nao está dando nenhum erro? vc ta montando a query certinha?

t+

gsfteodoro

Nenhum erro. A query está sendo montada corretamente.

Segue até ele montado:

SELECT VIAGEMMANI0_.VIAG_ID AS VIAG1_6_, VIAGEMMANI0_.VIAG_ATRAC_EFET AS VIAG2_6_, VIAGEMMANI0_.VIAG_CTIS AS VIAG3_6_, VIAGEMMANI0_.VIAG_DESATRACACAO AS VIAG4_6_, VIAGEMMANI0_.VIAG_DTE AS VIAG5_6_, VIAGEMMANI0_.NAVI_ID AS NAVI9_6_, VIAGEMMANI0_.VIAG_NUMERO AS VIAG6_6_, VIAGEMMANI0_.VIAG_PREV_ATRAC AS VIAG7_6_, VIAGEMMANI0_.VIAG_PREV_CHEG AS VIAG8_6_ FROM MNFT.VIAGEM VIAGEMMANI0_ WHERE VIAGEMMANI0_.VIAG_NUMERO = ? AND VIAGEMMANI0_.NAVI_ID = ?

O retorno do q.getResultList() é simplesmenet null. Se eu montar o comando concatenando os dados, trocando os parâmetros por uma query, retorna normalmente.

A

vc ja pegou essa query e com os parametros que vc ta passando e testando no seu BD, ela retorna algum dado?

gsfteodoro

Sim. Inclusive, a query está formatada visualmente até porque estava testando no Toad.
É como eu falei, se eu concatenar os dados e montar a query na unha, sem utilizar o q.setParameter(…), retornam dados normalmente.

A

posta a sua HQL para eu ver uma coisa

t+

gsfteodoro

O HQL é o que é enviado no método EntityManager.createQuery()?

Se sim, segue:

A

cara,

tenta fazer assim,

from Viagem t where numero =  :param1   AND navio =  :param2

t+

gsfteodoro

Mesma coisa. Retorno = null.

A

assim vc ja tentou,

select t from Viagem t where t.numero =  :param1   AND t.navio =  :param2

vc tem certeza que vc está que vc usando a mesma base aonde vc ta fazendo os testes?

t+

gsfteodoro

Problema encontrado.

O campo número é do tipo CHAR de tamanho 11.
Eu tentei fazer o teste lançando um like e retornaram dados.

Obrigado pela força.

A

ok…

marque o post como resolvido.

t+

Criado 10 de novembro de 2011
Ultima resposta 10 de nov. de 2011
Respostas 11
Participantes 2