JPA + Hibernate + getSingleResult

Pessoal,

Eu tenho o seguinte código:

public Boolean validaLogin(String login, String senha) { Query query = this.entityManager.createQuery("SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha"); query.setParameter("login", login); query.setParameter("senha", senha); System.err.println(login + "====" + senha); Usuario user = null; try { user = (Usuario) query.getSingleResult(); } catch (NoResultException e) { e.printStackTrace(); } return (user != null); }

Quando existe o dado no banco, tudo bem, ele executa certinho, mas quando não tem o usuário ou senha, ele gera o seguinte erro:

Hibernate: select usuario0_.id as id0_, usuario0_.CEP as CEP0_, usuario0_.bairro as bairro0_, usuario0_.cidade as cidade0_, usuario0_.compl as compl0_, usuario0_.email as email0_, usuario0_.endereco as endereco0_, usuario0_.estado as estado0_, usuario0_.estado_civil as estado9_0_, usuario0_.grupo_usuario_id as grupo10_0_, usuario0_.login as login0_, usuario0_.nome as nome0_, usuario0_.num_filhos as num13_0_, usuario0_.renda as renda0_, usuario0_.senha as senha0_, usuario0_.sexo as sexo0_, usuario0_.telefone as telefone0_ from Usuario usuario0_ where usuario0_.login=? and usuario0_.senha=?
javax.persistence.NoResultException: No entity found for query …

A chave primária de Usuario é o campo Id.
Alguém sabe com resolver isso?

Muito obrigado,

Então…
Este é o erro esperado. Você está tratando um Exception NoResultException e é isso que acontece.

Como no seu db não existe nenhum registro ele lança a excessão.

Como você não sabe se existe ou não um registro, acredito que este não seja o método ideal a se chamar.

Entendi,

Então é melhor usar o getResulList?
Ou tem jeito de usar o método find para algum campo que não chave primária?

Muito obrigado,

[quote=danielti]Entendi,

Então é melhor usar o getResulList?
Ou tem jeito de usar o método find para algum campo que não chave primária?

Muito obrigado,[/quote]

Vc pode fazer isto:

public Boolean validaLogin(String login, String senha) {
   Query query = this.entityManager.createQuery("SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha");
   
   query.setParameter("login", login);
   query.setParameter("senha", senha);
   
   Usuario user;

   try {
      user = (Usuario) query.getSingleResult();     
   } catch (NoResultException e) {
      user = null;
   }
   
   return (user != null);
}

Muito obrigado pela dica mas do seu jeito ele ainda gera o erro no log.

Não sei se estou sendo preciosista demais, mas queria o log limpo na medida do possível.

Resolvi desta forma:

[code]
public Boolean validaLogin(String login, String senha) {
Query query = this.entityManager.createQuery(“SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha”);
query.setParameter(“login”, login);
query.setParameter(“senha”, senha);
query.setMaxResults(1);
System.err.println(login + “====” + senha);
Usuario user = null;
List usuarios = null ;
try {
usuarios = query.getResultList();
} catch (RuntimeException re) {
re.printStackTrace();
}
if (usuarios.size() > 0) {
user = usuarios.get(0);
System.err.println(“Usuario :” + user.getNome());
}

            return (user != null);
      }[/code]

Vocês acham que ficou marreta ou ficou uma boa solução?

Obrigado,

[quote=danielti]Muito obrigado pela dica mas do seu jeito ele ainda gera o erro no log.

Não sei se estou sendo preciosista demais, mas queria o log limpo na medida do possível.

Resolvi desta forma:
public Boolean validaLogin(String login, String senha) {
Query query = this.entityManager.createQuery(“SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha”);
query.setParameter(“login”, login);
query.setParameter(“senha”, senha);
query.setMaxResults(1);
System.err.println(login + “====” + senha);
Usuario user = null;
List usuarios = null ;
try {
usuarios = query.getResultList();
} catch (RuntimeException re) {
re.printStackTrace();
}
if (usuarios.size() > 0) {
user = usuarios.get(0);
System.err.println(“Usuario :” + user.getNome());
}

            return (user != null);
      }

Vocês acham que ficou marreta ou ficou uma boa solução?

Obrigado,[/quote]

Cara, o log vai acusar erro pq não achou o resultado mesmo.
Deve ser alguma config. do Hibernate.

Ai no caso eu tratei a exceção para a sua abordagem.
Não da erro na aplicação.

O modo como vc fez está demasiado “marreta” e sucetível a erros.

Melhorando um pouco mais vc pode fazer isto:

public Boolean validaLogin(String login, String senha) {
   try {
      Query query = this.entityManager.createQuery("SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha");
   
      query.setParameter("login", login);
      query.setParameter("senha", senha);
   
      Usuario user;

      user = (Usuario) query.getSingleResult();     
   } catch (NoResultException e) {
      user = null;
   } catch (RuntimeException e) {
      e.printStackTrace();
   }
   
   return (user != null);
}

[]'s

Obrigado pela informação.