在Hibernate标准中区分大小写搜索

时间:2012-06-14 10:10:08

标签: java sql-server hibernate

我正在使用Hibernate 3和SQL Server 2008.我想在Hibernate Criteria中进行区分大小写的搜索。我无法实现它。我的代码如下:

Criteria criteria = session.createCriteria(User.class); /*line 1*/
criteria.add(Restrictions.eq("userName", userName));    /*line 2*/

我有一个 User.java 类,其中包含String userName

数据库条目:

id | user_name
--------------
1  | abc
2  | xyz

现在,如果我在第2行中将"abc"作为userName传递,那么它应该从数据库返回第一条记录。但是,如果我在第2行中将"Abc""ABC""aBC"等作为userName传递,则不应提取任何记录。

我访问了这个link,但它对我没有帮助,因为我不想对hql或SQL Server使用排序规则。我愿意使用Criteria进行整理,但不知道该怎么做。

6 个答案:

答案 0 :(得分:7)

Criteria criteria = s.createCriteria(User.class);
criteria.add(
    Expression.sql("userName = ? collate Latin1_General_CS_AS_KS_WS", userName, new StringType())
);

答案 1 :(得分:2)

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

1选择休眠并对结果进行程序过滤

2为创建表格使用区分大小写的归类时,您需要搜索:COLLATE SQL_Latin1_General_CP850_BIN2或其他为您的服务器指定的内容(从SYSTEMPROPERTY中读取)。

答案 2 :(得分:0)

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

Criteria criteria = s.createCriteria(User.class);   
criteria.add(Restrictions.ilike("userName", userName));

此致

答案 3 :(得分:0)

如果您选择 sql 路线,那么您在其他 HQL/Criterion 查询中引用别名时会遇到问题。所需要做的就是继承 LikeExpression 或其他任何内容并提供您自己的 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);

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

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

我使用“COLLATE latin1_general_cs”

创建表格字段

因此,此字段的每次搜索都区分大小写。

我的表格字段如下所示。

'case_sensitive_key'varchar(255)CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL DEFAULT'',

希望它会帮助你们中的一些人。