【问题标题】:JPA string comparisonJPA 字符串比较
【发布时间】:2011-11-09 06:09:13
【问题描述】:

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

一切顺利。有什么问题?谢谢一百万!

【问题讨论】:

  • 不要以明文形式存储密码:散列它们。一定要在其中创建参数的查询:使用参数(以避免代码注入)。

标签: string jpa comparison equals jpql


【解决方案1】:

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

【讨论】:

  • 我已经尝试了所有可能性:使用参数,更改不同的实现(EclipseLink 和 Hibernate),而字符串与 DB 中的字符串完全相同,但它仍然无法正常工作......
  • @user1036998 您的实体是如何定义的?字段“名称”如何注释(或在 orm.xml 中定义)?数据库中定义的列是什么?
  • @Id @Column(name = "NAME", length = 12) public String getName() { return this.name; } public void setName(String name) { this.name = name; } 感谢您的帮助!
  • @ArchBuddhiCat 您是在使用 JPA 生成数据库模式,还是在准备一个?您能否发布数据库列是如何定义的?您将什么值作为“名称”参数传递?
  • 我首先在Oracle数据库中创建了一个名为MUSER的表,然后定义了实体。 name 列定义为 CHAR 类型,长度为 12。稍后我将尝试删除表并让 JPA 自动创建表。name 参数是从由 JSF 页面调用的 EJB bean 传递的。跨度>
【解决方案2】:

我认为问题是由于字符串比较。我对这个问题的解决方案是:
使用小写进行比较。

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

【讨论】:

  • 我会使用 "WHERE LOWER(e.name) = LOWER(:name)" 并避免在 Java 中使用 name.toLowerCase()。将所有内容保存在一个地方,即关注点分离 (SoC)。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多