Erro com like %% - Hibernate + Criteria

11 respostas
J

Pessoal,

Estou com um problema na hora de validar meu login aqui, estou usadno o seguinte metodo:

public boolean ValidarLogin(String login, String senha) {
        Criteria c = session.createCriteria(Usuario.class);
        Criterion _login = Restrictions.ilike("login", "%" + login + "%");
        c.add(_login);
        Criterion _senha = Restrictions.eq("senha", senha);
        c.add(_senha);

        return c.uniqueResult() != null;
   }

O problema é que se eu tiver um usuario com o login teste e o outro com o login teste2, eu obtenho a seguinte mensagem de erro:

javax.servlet.ServletException: org.hibernate.NonUniqueResultException: query did not return a unique result: 2

Tentei colocar os sinais de percent antes do atributo login, como mostrado acima, para ficar parecido com SQL (like %login%) e com isso me trazer apenas do banco o que bate exatamente com o diigtado, mas nao foi, como sou novo com hibernate _ criteria, queria a ajuda de voces.

Desde ja agradeço.

11 Respostas

P

Cara…

Acredito que se voce remover os wildcards no like deva funcionar

Criterion _login = Restrictions.ilike("login", login );
T

login deve ser unico, entao não faz sentido ter esses “%” na consulta pois com esses “%” vc podera receber mais de um registro pela busca
E ter essa exception que vc recebeu.

J

Tirei os sinais de percent porem continuo tendo o mesmo problema
Ficou assim:

public boolean ValidarLogin(String login, String senha) {
        Criteria c = session.createCriteria(Usuario.class);
        Criterion _login = Restrictions.ilike("login", login);
        c.add(_login);
        Criterion _senha = Restrictions.eq("senha", senha);
        c.add(_senha);

        return c.uniqueResult() != null;
   }
LoginAction:
LoginForm loginForm = (LoginForm) form;
        String login = loginForm.getLogin();
        String senha = loginForm.getSenha();

        Usuario usuarioBanco = dao.PesquisarUsuarioPeloLogin(login);

        Usuario usuario = new Usuario(); 
        usuario.setCodigo(usuarioBanco.getCodigo());
        usuario.setLogin(login);
        usuario.setSenha(senha);
        usuario.setNome(usuarioBanco.getNome());
        usuario.setTipo(usuarioBanco.getTipo());

        request.setAttribute("usuario", usuario);

        try
        {
          if (dao.ValidarLogin(login, senha))
          {
            if (dao.VerificarSenha(login, senha))
            {
                retorno = "mudarSenha";
            }
            else
            {
                retorno = "logado";
            }
          }
          else
          {
            retorno = "erroLogin";
          }
          session.flush();
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            retorno = "erroLogin";
        }
UsuarioDao.VerificarSenha
public boolean VerificarSenha(String login, String senha) {
        Criteria c = session.createCriteria(Usuario.class);
        Criterion _login = Restrictions.eq("login", login);
        c.add(_login);
        Criterion _senha = Restrictions.eq("senha", senha);
        c.add(_senha);
        
        if ((senha.equals("1234")) && (c.uniqueResult() != null))
        {
            return true;
        }
        else
        {
            return false;
        }
   }

Sera que o problema esta nesse metodo ValidarSenha??
Soh me aparece o erro quando tento logar com o login jefferson ou jefferson12

T

como eu mensionei anteriormente o login deveria ser unico com isso a busca deveria utilizar a Restrictions.eq e não Restrictions.ilike
é diferente vc consultar com "… where campo = “xxx” " e "…where campo like “xxx” "

J

Coloquei o Restrictions.eq(“login”, login); e nada, eu ja fazia assim, mas quando começou esse erro eu fiz um teste com ilike.
Muito estranho isso

lalbertorj

Camarada e o seguinte o seu HQL está retornando 2 linhas do banco ou seja

se você esta informando o login = teste

% teste % o banco vai pegar tudo o que tem a palavra teste

remova o %

Vlw!

J

Eu já removi e nao funcionou.
Ficou assim: Restrictions.eq("login", login);

jcmird

Desconfio que exista dois login teste na sua tabela. O campo login é primary key? Faz um select * from tabela where login=“teste”, só para ver quantos registros são retornados.

Abraços,

J

Nao tem dois login teste nao, toda vez antes de salvar um novo usuario eu verifico se existe o login no Bd ou nao, estranho que aqui no PC do trabalho funcionou, aqui tenho o login jefferson, jefferson2 e jefferson26 e funcionou, o problema esta acontecendo quando rodo o mesmo projeto no PC de casa, mas as configurações estao iguais nos dois computadores, vou fazer mais teste e vejo o resultado

J

Pessoal, falei errado. O que está acontecendo é isso: se eu digitar jefferson1 e jefferson26 funciona, mas se eu digitar só jefferson, me retorna erro, dizendo que a query nao retornou um unico resultado, retorna 3
O que pode ser?

Meu ValidarLogin esta assim:
public boolean ValidarLogin(String login, String senha) {
        Criteria c = session.createCriteria(Usuario.class);
        Criterion _login = Restrictions.eq("login", login);
        c.add(_login);
        Criterion _senha = Restrictions.eq("senha", senha);
        c.add(_senha);

        return c.uniqueResult() != null;
   }
J

Alguem sabe o que posso fazer para nao ter mais esse problema?

Criado 3 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 11
Participantes 5