2012-06-14 72 views
4

我使用Hibernate 3与SQL Server 2008中区分大小写的搜索我想要做的Hibernate的标准区分大小写的搜索。我无法实现它。我的代码如下:Hibernate的标准

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

我有一个类User.java含有String userName

DB条目:

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

现在,如果我在第2行通过​​为userName,那么就应该从数据库返回的第一条记录。但是,如果我通过"Abc""ABC""aBC"等,在第2行userName,没有记录将被取回。

我访问过该link但我不希望使用排序规则与HQL或与SQL Server这不是对我很有帮助。我打算使用Criteria整理,但不知道如何去做。

回答

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

Expression.sql已弃用。改用: 'Session session = HibernateUtil.getSession(); Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction( “user_name =?collat​​e Latin1_General_CS_AS”,userName, new StringType())); user =(User)criteria.uniqueResult();' 请注意在sqlRestriction中,列名必须是数据库表中的原始列名(与HQL不同) – Thero

2

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

1选择与Hibernate和做的结果

2的程序筛选时创建表使用大小写敏感排序规则提起你NEAD搜索:COLLATE SQL_Latin1_General_CP850_BIN2或其他指定的服务器(从读SYSTEMPROPERTY)。

+0

感谢您的回复,但我不想使用collasion。还有其他解决方案吗? – RAS

+0

只有一个 - 程序过滤:您收到所有结果,并比较此结果与java String.equals(在eq中)或String.contains(如%中的%)或startWith(中类似%中的情况)等等。 – alexey28

+0

我也想避免那个循环。无论如何,感谢您的快速回复。 – RAS

0

你可以试试这个(使用ILIKE在限制API)

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

问候

+0

没有这样的方法存在。 – PVR

+0

这是安装的版本?看到这个:http://docs.jboss.org/hibernate/orm/3.3/reference/es-ES/html/querycriteria.html – esmoreno

+0

@esmoreno,你给出的链接不包含任何代码或行显示** enableLike()**是一个可以与**限制**一起使用的函数。 – RAS

-1

这可能并不适合你,但它可能是更好利用Lucene/Solr的这些类型的查询。除了不区分大小写的查询外,它还将为您处理其他常见场景。

-1

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

我创建“分页latin1_general_cs”

因此,在这个领域的每一个搜索将是区分大小写的表字段。

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

'case_sensitive_key' VARCHAR(255)字符集的latin1 COLLATE latin1_general_cs NOT NULL DEFAULT '',

希望这将有助于你们中的一些。