我使用JPQL查询编写了一个简单的登录系统,该查询始终不返回任何结果:

public boolean check(String name, String password) {
    final String qstring="SELECT e FROM Muser e WHERE e.name = '"+name+"'";
    Muser user;
    try{
        user = em.createQuery(qstring, Muser.class).getSingleResult();
    }
    catch(NoResultException e){
        return false;
    }
    return password.equals(user.getPassword());
}

当我将其更改为本地查询时:
user = (Muser) em.createNativeQuery(qstring, Muser.class).getSingleResult();

或int表达式:
final String qstring="SELECT e FROM Muser e WHERE e.id = "+id;

一切顺利。有什么问题?太感谢了!

最佳答案

您的JPA提供程序中的字符串比较可能存在问题。您是否在区分大小写的数据上进行测试?

您也可以尝试使用参数尝试(这是首选方法),而不是手工编写语句。这不仅更安全(防止SQL注入(inject)),而且更快:不仅对于Java(您不连接字符串),而且对于DB(对于所有执行都可以准备一次查询)。可能是这样的:

final String qstring = "SELECT e FROM Muser e WHERE e.name = :name";
TypedQuery<Muser> query = em.createQuery(qstring, Muser.class);
query.setParameter("name", name);
user = query.getSingleResult();

09-26 05:36