Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Busca com erro.

Olá,

Estou estudando JPA e me ocorreu algo estranho, no caso ao fazer um select com Query e Query.setParameter meu programa não efetua a busca, porém se eu deixar de usar o setParameter ele funciona.

Abaixo implementação.

private RhFuncionario buscaPeloRE(BaseJdePlanilha baseJde, EntityManager manager) {

        RhFuncionario rhFunc = new RhFuncionario();

        try {
            String re = baseJde.getRe().toString();
            Query query = manager.createQuery("select r from RhFuncionario r where r.re = "+re);
//            Query query = manager.createQuery("select r from RhFuncionario r where r.re = 29");

//            query.setParameter("re", baseJde.getRe().toString());

            rhFunc = (RhFuncionario) query.getSingleResult();


        } catch (Exception e) {
            System.out.println("Não encontrou funcionario re: " + baseJde.getRe());
        }

        return rhFunc;
    }
4 respostas
solução!

Renato eu acho que você precisaria alterar para

Query query = manager.createQuery("select r from RhFuncionario r where r.re = :re");

Oi Renato,

Como o Alex já disse, no JPQL está faltando seu parâmetro ser declarado.

Acrescentando a resposta do Alex, quero dizer que evite a todo custo esse tipo de consulta:

Query query = manager.createQuery("select r from RhFuncionario r where r.re = "+re);

Quando você concatena, você abre uma falha de segurança em que os usuários mais expertos ou mesmo mal intencionado poderia prejudicar seu sistema.

Faça sua query como o Alex falou. Completa ela ficaria assim:

private RhFuncionario buscaPeloRE(BaseJdePlanilha baseJde, EntityManager manager) {
  try {
    String re = baseJde.getRe().toString();

    // Usando TypedQuery apenas para evitar Casting!
    TypedQuery<RhFuncionario> query = manager.createQuery("select r from RhFuncionario r where r.re = :re", RhFuncionario.class);
    query.setParameter("re", re);

    return query.getSingleResult();
  } catch (Exception e) {
    System.out.println("Não encontrou funcionario re: " + re + ", com o erro: " + e.getMessage());
  }
}

Outra coisa que você precisa ter cuidado é ao capturar um erro, logar (imprimir no console) também o que aconteceu, para que você tenha uma ideia do que está havendo e para que isso fique registrado.

Outra coisa estranha é receber o EntityManager direto no método. Isso não parece muito legal. Porque ele não é um atributo dessa classe? Pense sobre isso e veja se vale a mudança.

Espero que tenha ajudado,

Abraço

Olá,

Obrigado Alex, efetuei as mudanças e funcionou !!!

Olá Paulo,

Obrigado pelo feedback, fiz as modificações conforme você me orientou e ficou muito melhor, valeu !!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software