2009-01-15 66 views
2

在SQL可以編寫一個查詢,搜索一個人的這樣一個名字:unicode字符串在Hibernate查詢

SELECT * FROM Person P WHERE P.Name LIKE N'%ike%' 

此查詢將Unicode字符(假設名稱列和數據庫都安裝運行處理unicode支持)。

我在HQL(NHibernate)運行的HQL中有類似的查詢。生成的查詢如下所示:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%' ) 

不幸的是,在HQL中將字母前置'N'會導致錯誤。我試過逃避字符串中的unicode字符,但仍然沒有成功。

數據庫正在接受和保存Hibernate的Unicode字符。我已經能夠使用unicode字符串成功填充對象,使用Hibernate保存它,並在數據庫中驗證它。在我看來,有點奇怪的是,我不能在自定義查詢中使用unicode字符串(或者我還假設命名查詢)。

這是Hibernate(Nhibernate)的一個已知問題或限制嗎?你如何在HQL中使用unicode?

有幾個網站建議使用標準查詢。由於我在工作的框架中存在一些限制,這是不可能的。

回答

2

你有沒有試着用參數:

IList<Person> people = session 
    .CreateQuery("from Person p where p.Name like :name") 
    .SetParameter("name", "%カタカ%") 
    .List<Person>(); 

他們也必須保護你對SQL注入查詢的優勢。

+0

我遞歸構建一個複雜的查詢字符串不同的標準和操作。我有一個提供者,我將操作和術語傳入以獲取「喜歡」部分。如果我不這樣做,這將工作!我希望有一些神奇的逃生角色。 – 2009-01-15 19:39:35

+0

不幸的是,查詢中可用參數的數量有限制,所以這不是最終的解決方案。 – spartaco 2017-07-25 13:55:13

2

我發現了一個可行的解決方案。我非常懷疑這是最好的解決方案。然而,這是我要實現的解決方案,直到我可以授權重寫我正在開發的軟件的整個查詢構建部分。

在該實例:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%') 

where子句包含此字面:

'%カタカ%' 

此文字可以被分解成nchars其中休眠(Nhibernate的)會不知不覺穿過到SQL它產生。奇怪的,但它的作品。因此,前面的查詢可以寫成:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%' + nchar(0x30AB) + nchar(0x30BF) + nchar(0x30AB)+ '%') 

該解決方案是遠遠沒有達到最佳,因爲這需要經歷每個字符,並確定它是一個多字節字符。但是,如果代碼位於其應用程序中,它將用於動態查詢生成器,該生成器可以在不同的操作下處理多個不同的標準。在我給它的例子中,在字符串中的任何位置查找unicode。有可能這個函數可能會返回列的where子句部分等於一個特定的數值,或者它可能正在查找字符串的起始字符。構建運算符的方法使用運算符類型和該術語來交回字符串。我可以重寫,但這將是一個大任務。上述修復將允許我處理傳遞給此方法的字符串。我提供這個解決方案,因爲它確實有效,但達林的答案可能是我能找到的最好方法。

0

出現此問題是因爲NHibernate嘗試訪問沒有類型長度的列。因此在HBM中。xml提及Legacy數據庫的長度非常重要,否則它將失敗UNIcode相關的東西。

感謝, 他尼