为什么用户名和密码返回null?

时间:2012-03-05 17:10:50

标签: java

所以我使用Java持久性获得了这个用户名和密码验证码。

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。我的代码或逻辑有什么问题吗?

2 个答案:

答案 0 :(得分:1)

您应永远查询密码。

您要运行的查询是:

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

收到用户后,请检查代码中的密码有效性。这一点特别重要,因为您显然是在对您的密码进行哈希处理。正确?

答案 1 :(得分:0)

执行查询时可能会抛出异常。你必须打印堆栈跟踪才能看到原因。

我猜(不确定)如果其他配置设置正确,问题可能出在q.getSingleResult();行。

Jpa期待一个独特的结果。但是,您的查询可以通过用户名= .. 密码= ....生成设置订阅者

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

所以方法getSingleResult()抛出异常。

另外,您可以考虑将jpa TypedQuery与泛型一起使用,而不是手动进行类转换。