Java Hibernate条件中区分大小写的搜索

Java Hibernate条件中区分大小写的搜索,java,sql-server,hibernate,Java,Sql Server,Hibernate,我将Hibernate3与SQLServer2008一起使用。我想在Hibernate条件中进行区分大小写的搜索。我无法实现它。我的代码如下: Criteria criteria = session.createCriteria(User.class); /*line 1*/ criteria.add(Restrictions.eq("userName", userName)); /*line 2*/ 我有一个类User.java,它包含一个字符串用户名 数据库条目: id | user

我将Hibernate3与SQLServer2008一起使用。我想在Hibernate条件中进行区分大小写的搜索。我无法实现它。我的代码如下:

Criteria criteria = session.createCriteria(User.class); /*line 1*/
criteria.add(Restrictions.eq("userName", userName));    /*line 2*/
我有一个类User.java,它包含一个
字符串用户名

数据库条目:

id | user_name
--------------
1  | abc
2  | xyz
现在,如果我在第2行将
“abc”
作为
userName
传递,那么它应该返回数据库中的第一条记录。但是如果我在第2行将
“Abc”
“Abc”
“Abc”
等作为
用户名
传递,则不应获取任何记录


我已经访问过这个网站,但它对我没有帮助,因为我不想将排序规则用于hql或SQL Server。我愿意将排序规则与
标准一起使用,但不知道如何使用。

您不能使用hibernate。问题出在MS SQL中-默认情况下,它使用不区分大小写的排序规则。可以有两种变通方法:

1用hibernate选择并对结果进行程序过滤

2为需要搜索的字段创建表区分大小写排序规则时:整理SQL\u Latin1\u General\u CP850\u BIN2或为服务器指定的其他内容(从SYSTEMPROPERTY读取)。

您可以尝试此操作(在API中使用ilike)


关于

这可能不适合您,但最好使用lucene/solr进行此类查询。除了不区分大小写的查询外,它还将为您处理其他常见情况。

我添加了相同的问题,并直接在mariadb服务器中更改了数据库表中的排序规则类型

Criteria criteria = s.createCriteria(User.class);
criteria.add(
    Expression.sql("userName = ? collate Latin1_General_CS_AS_KS_WS", userName, new StringType())
);
我用“COLLATE latin1\u general\u cs”创建表字段

所以在这个领域的每一次搜索都是区分大小写的

我的表字段如下所示

“区分大小写的密钥”varchar(255)字符集latin1 COLLATE latin1\u general\u cs非空默认值“”


希望它能对你们中的一些人有所帮助。

如果您选择sql路线,那么在HQL/Criteria查询中引用别名会有问题。所需的只是像Expression之类的子类,并提供自己的toSqlString()方法。在MySql中测试

private static class CaseSensitiveLike extends LikeExpression {

    protected CaseSensitiveLike(final String propertyName,
            final String value, final MatchMode mode) {
        super(propertyName, value, mode);
    }

    @Override
    public String toSqlString(final Criteria criteria,
            final CriteriaQuery criteriaQuery) {
        String sql = super.toSqlString(criteria, criteriaQuery);
        return sql + " collate utf8_bin";
    }
}
然后,以下调用可以互换:

Criterion insensitive = Restrictions.like(myProperty, myValue, MatchMode.ANYWHERE);
Criterion sensitive =  new CaseSensitiveLike(ldProperty, value, MatchMode.ANYWHERE);

谢谢你的回复,但我不想用拼贴。还有其他解决方案吗?只有一个-程序过滤:您接收所有结果,然后在循环中将此结果与java String.equals(如果是eq)或String.contains(如果是%like%)或startWith(如果是like%)等进行比较。我也希望避免该循环。无论如何,感谢您的快速回复。不幸的是,没有其他方法:在创建表时调用,或者在查询或循环中使用其他区分大小写的检查。好的,或者使用其他区分大小写的数据库,当使用SELECT进行搜索时,“查询内部”是什么意思?不存在这样的方法。安装的版本是什么?请参见:@esmoreno,您提供的链接中没有任何代码或行显示enableLike()是一个可用于限制的函数。@RAS,您完全正确。有关文档,请参阅15.6节。您可以尝试一下吗?@esmoreno,我尝试过,但对我无效。该文件也只提供了理论。您能提供一些如何使用示例的好例子吗?Expression.sql已被弃用。改用:
Session Session=HibernateUtil.getSession();条件=session.createCriteria(User.class);添加(Restrictions.sqlRestriction(“user\u name=?collate拉丁语1\u General\u CS\u AS”,用户名,new StringType());user=(user)criteria.uniqueResult()请注意,在sqlRestriction中,列名必须是数据库表中的原始列名(与HQL不同),如果在映射表中,如果有人手动将值从大小写编辑为小写或任何它不会显示在列表中的内容,则有一件事。SOlr将解决搜索问题,但如果sql server中发生某些更改,则会发生数据不一致
Criterion insensitive = Restrictions.like(myProperty, myValue, MatchMode.ANYWHERE);
Criterion sensitive =  new CaseSensitiveLike(ldProperty, value, MatchMode.ANYWHERE);