2011-11-02 53 views
12

我爲Hibernate + MySQL編寫了一個項目。現在我將它移植到德比(出於許多原因)。HQL是否具有與Restrictions.ilike(對於不區分大小寫的匹配)等效的內容?

現在我發現在查詢中使用LIKE時,Derby是區分大小寫的。這可以使用標準查詢中的Restrictions.ilike(...)解決......但我有很多複雜使用該查詢的HQL查詢。有沒有辦法在HQL中擁有類似ilike的功能?

+0

您正在告訴** like **將無法在Derby數據庫中使用HQL嗎? – ManuPK

+1

like * will *可以工作,但區分大小寫 – gotch4

回答

15

有一個在HQL沒有ilike等效的功能。正如Konstantin已經在他的suggestion中指出的那樣,您的最佳選擇是tune the database connection並將collation設置爲TERRITORY_BASED:SECONDARY,如本JIRA:DERBY-1748: Global case insensitive setting中所述。

考慮到所有的平等性(=)和like將不區分大小寫。這可能會有點過分,並且不適合您的特定情況。

解決此問題的另一種方法是創建基於函數的索引(當然,如果Derby支持它們)並調整HQL以合併likelower這樣。

Query q = session.createQuery("... WHERE lower(entity.field) like ?)"); 
q.setString(0, '%' + variable.toLowerCase() + '%'); 

如果Derby不支持FBI(我認爲沒有),您也可以使用較低的值創建觸發器填充的列並對它們進行索引。

UPDATE這似乎是可能定義導出/自動生成的列,如在此其它JIRA解釋:JIRA-481: implement SQL generated columns

+0

但gotch4更喜歡保留他的HQL查詢 –

+0

如果他不想更改連接排序規則,他沒有其他選擇。而且我明白他不想將它們變成標準查詢。 –

+1

我明白他 - 可能是重構和測試的地獄 –

相關問題