JPA字符串比较

时间:2011-11-09 06:09:13

标签: string jpa comparison equals jpql

我使用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; 

没事。有什么问题?万分感谢!

2 个答案:

答案 0 :(得分:3)

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

你也可以尝试(这是首选的方式)使用参数而不是手工制作你的陈述。它不仅更安全(防止SQL注入)而且更快:不仅适用于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();

答案 1 :(得分:1)

我认为问题是因为字符串比较。我解决这个问题的方法是:
使用小写字母进行比较。

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