Erro com Restrictions do Criteria

5 respostas
J

Pessoal,

Estou com um problema na hora de fazer uma restrição na minha query.
Já tentei com Restriction.eq, Restrition.ilike e Restriction.like e não consigo fazer com que a minha query me retorne apenas um valor, se eu tiver valores parecidos cadastrados no BD me dá erro, estou precisando disso para validar meu login, já tentei de tudo e vi no log do mysql q sempre ele coloca o percent(%) no final, com isso vindo todos os com o login parecido.
Meu metodo esta assim:

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

        return c.uniqueResult() != null;
   }

Eu coloco eq, like e ilike e sempre a query que é mostrado no log do MySQL é essa:

select this_.codigo as codigo0_0_, this_.login as login0_0_, this_.nome as nome0_0_, this_.senha as senha0_0_, this_.tipo_usuario_codigo as tipo5_0_0_ from catalogo.usuario this_ where lower(this_.login) like 'jefferson%'

Sempre esta sendo colocado o percent no final do login. Ja fiz teste e o problema eh no metodo, ja coloquei o login na mão como teste e continua o mesmo erro.

Alguem sabe o que pode ser?

5 Respostas

Java_Boy

Manda o sql gerado quando tudo está com Restrictions.eq

J

O log do mysql mostra esse sql:

1. select this_.codigo as codigo0_0_, this_.login as login0_0_, this_.nome as nome0_0_, this_.senha as senha0_0_, this_.tipo_usuario_codigo as tipo5_0_0_ from catalogo.usuario this_ where lower(this_.login) like 'jefferson%'

Mesmo se eu colocar .eq ou .like, ele esta sempre colocando like e retornando essa query

J

Acabei de fazer o login e o monitor do mysql me retonou essa query:

select this_.codigo as codigo0_0_, this_.login as login0_0_, this_.nome as nome0_0_, this_.senha as senha0_0_, this_.tipo_usuario_codigo as tipo5_0_0_ from catalogo.usuario this_ where lower(this_.login) like 'jefferson26%'

Estou usando o .eq, e ele me retorna essa consulta usando o like.
O mais estranho é que eu tenho um metodo parecido com o ValidarLogin e esse metodo nao me retorna erro.

VerificarSenha (igual ao ValidarLogin, mas nao me retorna erro)
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;
        }
   }

A query que esse metodo VerifiarSenha retorna é essa:

select this_.codigo as codigo0_0_, this_.login as login0_0_, this_.nome as nome0_0_, this_.senha as senha0_0_, this_.tipo_usuario_codigo as tipo5_0_0_ from catalogo.usuario this_ where this_.login='jefferson1' and this_.senha='1234'

Como dois metodos parecidos (quase iguais) me retornam queries diferentes?

Java_Boy

Isso é coisa do demo! haha

Mas faz o seguinte, só por desencargo de consciência, tenta adicionar as propriedades diretamente.

session.createCriteria(Usuario.class).add(Restrictions.eq("login", login)).add(Restrictions.eq("login", login)).uniqueResult();

E veja o que ele retorna

J

A.L,

Eu já tinha feito isso, mas como estava com cabeça quente, tentei de novo e nada, tá fogo. Olha o finalzinho do log do mysql:

7 Query	SET autocommit=0
100307 21:29:18	    7 Query	select this_.codigo as codigo0_0_, this_.login as login0_0_, this_.nome as nome0_0_, this_.senha as senha0_0_, this_.tipo_usuario_codigo as tipo5_0_0_ from catalogo.usuario this_ where lower(this_.login) like 'jefferson%'

Inacreditavel, nao sei porque ele esta colocando o percent no final nem porque esta usando o like e nao o =.
Com a sua dica meu metodo ficou assim:

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

        return session.createCriteria(Usuario.class).add(Restrictions.eq("login", login)).add(Restrictions.eq("senha", senha)).uniqueResult() != null;

    }

Rodei com esse metodo, do jeito que esta, o log foi gerado com esse metodo.
Nao sei mais o que faço.

Criado 5 de março de 2010
Ultima resposta 7 de mar. de 2010
Respostas 5
Participantes 2