【问题标题】:Criteria in hibernate is incasesensitive?休眠中的条件是不区分大小写的吗?
【发布时间】:2015-07-31 01:43:36
【问题描述】:

我正在使用标准 api 来检查用户名是否存在。之后,我正在检查密码。但用户名不区分大小写。我想让它区分大小写。

Criteria criteria2 = session.createCriteria(UserMaster.class);
criteria2.add(Restrictions.eq("userName", userName));
userDetails = (UserMaster)criteria2.uniqueResult();
if(userDetails != null) {
      //logic goes here
 }

任何帮助将不胜感激。

【问题讨论】:

  • 这可能取决于您使用的数据库或数据库的设置。例如,据我所知,MS SQL Server 默认情况下会进行不区分大小写的字符串比较,而 Oracle 会区分大小写。
  • @Jesper 我认为你应该回答这个问题。
  • 在数据库端进行了以下更改,但仍然无法正常工作。 ALTER TABLE USER_MASTER CHANGE PASSWORD PASSWORD VARCHAR(255) BINARY;
  • 我不希望它起作用。您的数据库是什么品牌/版本?查看数据库的文档以了解如何更改此设置。

标签: java hibernate


【解决方案1】:

字符串的比较方式取决于数据库的品牌和版本以及数据库的设置。某些数据库(例如 Microsoft SQL Server)默认以不区分大小写的方式比较字符串,而其他数据库则以区分大小写的方式比较字符串。

检查数据库的设置;查找特定品牌和数据库版本的文档以了解如何更改此设置。

如果确实是 MS SQL Server,那么看看这个问题的例子:Sql Server check case sensitivity?

【讨论】:

    【解决方案2】:

    我可以说一个简单的解决方案。但这不是一条直截了当的方法。使用 MD5 加密您的用户名并将其保存到数据库。比较用户名时,必须对给定的用户名进行 MD5 加密,并与数据库中保存的用户名进行比较。但我不推荐这个解决方案,无论如何你也可以使用它。 :)

    【讨论】:

      【解决方案3】:

      我对原生sql做了如下

      Query query = session.createSQLQuery("select * from USER_MASTER where binary USER_NAME='"+userName+"'").addEntity(UserMaster.class);
      userDetails = (UserMaster)query.uniqueResult();
      if(userDetails != null) {
        //code goes here
      }
      

      【讨论】:

      • 小心将用户名直接放在 SQL 语句中,这会使您的程序容易受到SQL injection 的攻击。有一天Bobby Tables 会在你的系统上创建一个帐户...
      猜你喜欢
      • 2011-05-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2011-09-25
      • 1970-01-01
      • 2014-08-15
      • 2014-07-24
      相关资源
      最近更新 更多