我正在使用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
进行整理,但不知道该怎么做。
答案 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'',
希望它会帮助你们中的一些人。