5

我正在使用带有 SQL Server 2008 的 Hibernate 3。我想在 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

我已经访问过这个链接,但它对我没有帮助,因为我不想将排序规则与 hql 或 SQL Server 一起使用。我愿意使用排序规则,Criteria但不知道该怎么做。

4

6 回答 6

7
Criteria criteria = s.createCriteria(User.class);
criteria.add(
    Expression.sql("userName = ? collate Latin1_General_CS_AS_KS_WS", userName, new StringType())
);
于 2013-06-08T04:40:11.873 回答
2

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

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

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

于 2012-06-14T10:27:17.997 回答
0

你可以试试这个(在 Restrictions API 中使用 ilike)

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

问候

于 2012-06-14T12:40:02.280 回答
0

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

我用“COLLATE latin1_general_cs”创建表字段

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

我的表字段看起来像这样。

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

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

于 2016-06-14T11:51:09.600 回答
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);
于 2021-05-05T10:19:27.360 回答
-1

这可能不适合您,但最好将 lucene/solr 用于此类查询。除了不区分大小写的查询之外,它还会为您处理其他常见场景。

于 2012-06-29T09:48:27.397 回答