2012-03-05 5 views
1

Итак, у меня есть этот код для проверки имени пользователя и пароля с использованием Java persistence.Почему имя пользователя и пароль не возвращаются?

public Subscriber validateLogin(String username, String password) 
{ 
    EntityManager em = getEntityManager(); 

    Query q = em.createQuery("SELECT s FROM Subscriber s WHERE s.username = :username OR s.password = :password "); 

    q.setParameter("username", username); 
    q.setParameter("password", password); 

    try 
    { 
     return (Subscriber) q.getSingleResult(); 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 
} 

Так я проверяю, если абонент ничего возвращать или null. Вот мой код:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    // TODO add your handling code here: 
    SubscriberJpaController sjc = new SubscriberJpaController(); 
    Subscriber sub = sjc.validateLogin(jTextField1.getText(), jPasswordField1.getText()); 

    System.out.println(sub); 
} 

и возвращает null. Что-то не так с моим кодом или логикой?

+1

Распечатайте stacktrace перед возвратом null в вашем блоке catch. – Kent

+1

Единственная проблема, которую я вижу, это 's.username =: username ИЛИ s.password =: password'. Разве это не должно быть «И»? В противном случае, если кто-то ошибочно получит пароль, он все равно войдет в систему. – Jim

+0

iuse AND и его все еще null. мой класс Subscriber является абстрактным классом. любая проблема с этим? – tddiaz

ответ

0

может возникнуть исключение, возникшее при выполнении запроса. вам нужно распечатать стек, чтобы увидеть причину.

Я думаю (не уверен) проблема может быть на линии q.getSingleResult();, если были установлены другие конфигурации.

Jpa ожидает уникальный результат. однако ваш запрос может создать набор подписчиков по имени пользователя = .. или пароль = .... например.

user a(uname,pwd)= ("usera","123") 
user b(uname,pwd)= ("userb","123") 

поэтому метод getSingleResult() выдает исключение.

Кроме того, вы можете использовать jpa TypedQuery с общим вместо того, чтобы вручную выполнять класс.

+0

Да, проблема с q.getSingleResule(), shoud будет q.getResultList()? – tddiaz

1

Вы должны никогда запрос на пароль.

Запрос вы хотите запустить это:

m.createQuery("SELECT s FROM Subscriber s WHERE s.username = :username");

После того, как вы получили пользователь, то проверить правильность пароля в коде. Это особенно важно, потому что вы, очевидно, хешируете свои пароли. Правильно?

+0

Как вы узнали, что OP «очевидно» зашифровал pwd? – Kent

+1

@ Kent Mark делает точку, не предполагая, что OP зашифровал пароль. –

+0

@Mark я следую тому, что вы предложили. но он возвращает null. – tddiaz

Смежные вопросы