所以我使用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
。我的代码或逻辑有什么问题吗?
答案 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与泛型一起使用,而不是手动进行类转换。