2012-06-14 92 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 '',

希望這將有助於你們中的一些。