JPA 字符串比较

发布于 2024-12-14 10:16:54 字数 670 浏览 3 评论 0原文

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

一切正常。有什么问题吗?谢谢一百万!

I've written a simple login system using a JPQL query, which always returns no result:

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());
}

When I changed it to a native query:

user = (Muser) em.createNativeQuery(qstring, Muser.class).getSingleResult();

or an int expression:

final String qstring="SELECT e FROM Muser e WHERE e.id = "+id; 

It goes all right. What's the problem? Thanks a million!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

请止步禁区 2024-12-21 10:16:54

这可能是 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();

It might be a problem with string comparison in your JPA provider. Do you test it on the case-sensitive data?

You could also try (and it's the preferred way) using parameters instead of crafting your statement by hand. It's not only safer (prevents SQL injection) but also faster: not only for Java (you don't concatenate Strings) but also for the DB (the query can be prepared once for all executions). It might be something like this:

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();
笛声青案梦长安 2024-12-21 10:16:54

我认为问题是因为字符串比较。我对此问题的解决方案是:

使用小写字母进行比较。

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();

I think problem is because of String comparison.My solution to this problem is:

using lowercase for comparison.

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();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文