Erro com Query com clausula AND com JPA e toplink

2 respostas
D
Estou precisando de query de login que por consequencia deve vereficar no login e senha. Estou fazendo assim:
String sql="Select p from Pessoa p where p.login LIKE :log ";
        
        Query q = em.createQuery(sql);
        q.setParameter(1,login);
        q.setParameter(2,senha);
Esta acusando o seguinte erro: Exception in thread "main" java.lang.IllegalArgumentException: An exception occured while creating a query in EntityManager at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.createQuery(EntityManagerImpl.java:180) at prof.negocio.Autenticador.login(Autenticador.java:32) Eu agradeço qualquer sugestão.

2 Respostas

Javabuntu
1. String sql="Select p from Pessoa p where p.login LIKE :log "; 2. 3. Query q = em.createQuery(sql); 4. q.setParameter(1,login); 5. q.setParameter(2,senha);

o detalhe é que vc tá setando 2 parâmetros e só está passando 1... e vc só comparou o login....vc tem que comparar user com login AND senha...

colega não sei se ainda precisa da ajudar...mas eu faço assim(eu uso Hibernate e não toplink, porém como a JPA abstrai do framework vai funcionar certinho com toplink...):

public User GetLogin(String login, String password)  {
              Query query = em.createQuery("SELECT u FROM User u WHERE u.login = :login AND u.password = :password");
               query.setParameter("login", login);
               query.setParameter("password", password);
        
               List rs = qry.getResultList();
                if(rs.size() > 0) {
                return (User) rs.get(0);
        } else {
            return null;
        }
    }

    }
funciona 100%..testado...

se não conseguir manda ai a duvida..

eliaspbareia

:idea: Fiz um pouco diferente. Acrescentei o SQL lá na classe login.java que havia criado:

@Entity
@Table(name = "login")
@NamedQueries({@NamedQuery(name = "Login.findByLogin", query = "SELECT l FROM Login l 
                                   WHERE l.usuario = :usuario and l.senha = :senha")

No botão Confirmar fiz o seguinte:

@Action
    public void confirmarLogin() {
       try { 
        String pwd = new String(txtSenha.getPassword()); //Pega a senha de um JPasswordField
       
        javax.persistence.Query query = em.createNamedQuery("Login.findByLogin"); // <== Busca na nossa entidade
        query.setParameter("usuario", txtUsuario.getText());  //Comparamos os parâmentros
        query.setParameter("senha", pwd);		      //Comparamos os parâmentros	
        Login u = (Login) query.getSingleResult();
        setMenuItemStates(loginState.LOGADO);		      //Atualizamos os estado dos menus
        painelLogin.setVisible(false);			      //Desaparece com o painel de login.

       }catch(Exception e){
         JOptionPane.showMessageDialog(null, "Infelizmente, usuário e senha não conferem!");
            setMenuItemStates(loginState.NOLOGADO);		//Deu zebra, então não habilita os menus
            painelLogin.setVisible(true);			//O painel continua vizivel 
            txtUsuario.requestFocus();				//Dá foco ao JTextField
       }
    }

Ficou bem interessante. Espero que ajude.
Qualquer coisa, chame o homem aranha. :shock:

Links úteis: http://ironbark.bendigo.latrobe.edu.au/subjects/OAD/UnitMaterial.html

Criado 2 de dezembro de 2007
Ultima resposta 10 de jan. de 2009
Respostas 2
Participantes 3