[RESOLVIDO]Como tratar quando Query retorna nenhum resultado em JPA

Tenho o código abaixo, e ele funciona, quando algo veio do banco de dados. Quando o banco de dados não retorna valores ele da erro.

Minha dúvida gira em torno de:

quando tenho um dado dentro da classe eu posso usar o usuario.getDadoQueQuero mas como testar se esse dado exite, pois quando ele tenta testar no ELSE ele retorna o erro.

javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.

Existe algum método específico para isto? Estou usando JPA (como deve ter dado pra perceber. kkk )

[code]Usuario usuario = new Usuario();
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“Vestibulando_ManagerPU”);
EntityManager em = emf.createEntityManager();
try {
usuario = (Usuario) em.createNamedQuery(“Usuario.findByLoginUsu”)
.setParameter(“loginUsu”, login)
.getSingleResult();
} catch (Exception e) {
e.printStackTrace();
}

        if (usuario.getLoginUsu().equals(login)) {
            JOptionPane.showMessageDialog(null, "Bem vindo!");
            return (true);
        } else {
            JOptionPane.showMessageDialog(null, "Usuário ou senha inválidos!");
            return (false);
        }[/code]

Antes de tentar acessar qualquer método ou atributo de um objeto, você deve ter certeza que o objeto não é nulo.
Ou seja

if (usuario != null && usuario.getLoginUsu().equals(login)) {  
                JOptionPane.showMessageDialog(null, "Bem vindo!");  
                return (true);  
            } else {  
                JOptionPane.showMessageDialog(null, "Usuário ou senha inválidos!");  
                return (false);  
            }  

obrigado pela dica e vou anotar aqui. hehe
realmente faz muito sentido…

mas como nem tudo são flores, fiz a implementação da forma que disse, mas… o erro persiste.

Percebi que nem está chegando no IF, esta dando erro na exceção direto.

No código a seguir ele exibe a mensagem exceção.

[code]try {
usuario = (Usuario) em.createNamedQuery(“Usuario.findByLoginUsu”)
.setParameter(“loginUsu”, login)
.getSingleResult();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Exceção!!”);
e.printStackTrace();
}

        if (usuario != null && usuario.getLoginUsu().equals(login)) {
            return (true);
        } else {
            JOptionPane.showMessageDialog(null, "Usuário ou senha inválidos!");
            return (false);
        }[/code]

Sim, este é outro ponto. O erro persiste por que você está fazendo um

SELECT * FROM qualquer_tabela WHERE qualquer_tabela.qualquer_atributo = ?

E não encontra nada.
Das duas uma, ou não tem dados na tabela ou o parâmetro passado não confere com nenhum registro que existe na tabela.

[quote=drsmachado]Sim, este é outro ponto. O erro persiste por que você está fazendo um

SELECT * FROM qualquer_tabela WHERE qualquer_tabela.qualquer_atributo = ?

E não encontra nada.
Das duas uma, ou não tem dados na tabela ou o parâmetro passado não confere com nenhum registro que existe na tabela.[/quote]

Seguinte, o select que estou tentando é pegar o login do usuario e a senha dele e conferir no BD se existe a mesma combinação.

se positivo a query retorna apenas um valor, se o login ou senha estiverem errados ou não existirem no banco de dados, então não irá retornar nada mesmo. Achei mais prático assim pois faço o calculo do MD5 da senha e a comparação diretamente dentro do BD.

Exemplo de uso preenchido:
retorna 1 resultado> SELECT * FROM Usuario WHERE LoginUsu = ‘admin’ AND SenhaUsu = MD5(‘admin’)
retorna nenhum resultado> SELECT * FROM Usuario WHERE LoginUsu = ‘admin’ AND SenhaUsu = MD5(‘QualquerOutraSenha’)

Mas como quer fazer isso se passa apenas o parâmetro referente ao login?

 usuario = (Usuario) em.createNamedQuery("Usuario.findByLoginUsu")  
                        .setParameter("loginUsu", login)  
                        .getSingleResult();  

Onde está enfiando a senha, camarada?

[quote=drsmachado]Mas como quer fazer isso se passa apenas o parâmetro referente ao login?
Onde está enfiando a senha, camarada?[/quote]

Desculpe… é que postei o exemplo sem o md5… mas questão é assim então.

Dividir em problemas menores o MD5 é outro problema.

Vamos lá.

Pego o login do usuario e vou ate o bd buscando esse usuario. Se ele informar um usuario correto então irá retornar um valor (considerando usuario como campo UNIQUE)
Mas se ele informar um usuario inexistente ira retornar zero valores, portanto sei que o usuario não existe. Como tratar isto?
porque quando informa usuario inexistente no bd ele pega e esta dando o erro.

Camarada, entenda, o singleResult espera que haja um só elemento para a busca. Se não existe, ele dispara exception.

Entendi, isto que eu não sabia.

Existe algum método que aceite 0 resultados?

Vou testar com ResultList.

jaja postos os resultados dos testes.

RESOLVIDO!

Muito obrigado drsmachado.

Como o drsmachado mesmo disse, o getSingleresult espera um resultado final, por isto dispara um exception, já o list aceita não retornar nada. Então troquei o single por um list, e em vez de povoar o objeto com os dados eu coloquei tudo dentro de uma Lista.

A solução para quem precisar ficou assim:

[code]
Usuario usuario = new Usuario();
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“Vestibulando_ManagerPU”);
EntityManager em = emf.createEntityManager();
List usuarios = null;
try {
usuarios = em.createNamedQuery(“Usuario.findByLoginUsu”)
.setParameter(“loginUsu”, login)
.getResultList();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Excessão!!”);
e.printStackTrace();
}

        if (usuarios.isEmpty()) {

//entra aqui se a query não retorna nada
JOptionPane.showMessageDialog(null, “Usuário ou senha inválidos!”);
return (false);
} else {
//aqui faz os testes se retornar aqui
if (usuarios.get(0).getLoginUsu().equals(this.login)){
return (true);
}
}[/code]

drsmachado, se puder me ajudar agora no problema do MD5, hehe

abri um tópico específico pra ele: