2011-11-02 4 views
12

私はHibernate + MySQLのプロジェクトを書いています。今私はそれをDerbyに移植しています(いくつかの理由で)。HQLにRestrictions.ilike(大文字と小文字を区別しない一致)の機能がありますか?

これで、DerbyがクエリでLIKEを使用するときに大文字と小文字が区別されることが判明しました。これは、条件照会でRestrictions.ilike(...)を使用して解決できますが、多くの場合、複合語これを使用するHQL照会があります。 HQLにilikeのような機能を持たせる方法はありますか?

+0

**あなたがDerbyデータベースでHQLを動作させないように言っていますか? – ManuPK

+1

のように*は機能しますが、大文字と小文字を区別する – gotch4

答えて

15

HQLにはilike同等の機能はありません。コンスタンチンは既にsuggestionで指摘しているように、このJIRAで説明されているように、にcollationTERRITORY_BASED:SECONDARYと設定することをお勧めします。DERBY-1748: Global case insensitive setting

すべての等価(=)とlikeは大文字と小文字を区別しないことに注意してください。これは少し遠すぎて、あなたの特定の状況に適していない可能性があります。

これに対処するもう1つの方法は、関数ベースのインデックスを作成することです(Derbyがそれらをサポートしている場合はもちろんです)。likelowerをこのように結合するようにHQLを調整します。

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

ダービーは、FBIの(私はそれはないと思います)をサポートしていない場合は、低い値とインデックス、それらをして、トリガー充填カラムを作成することができます。

UPDATE他のJIRA:JIRA-481: implement SQL generated columnsで説明されているように、派生/自動生成列を定義することは可能であるようです。

簡単な回避策は、大文字(または小文字)への両方の単語を変換することです
+0

しかし、gotch4はHQLクエリを保持することを好みます –

+0

接続照合を変更したくない場合は、他のオプションはありません。そして、彼はそれらを条件照会に変えたくないと思った。 –

+1

私は彼を理解しています - リファクタリングとテストの地獄である可能性があります –

2

私は申し訳ありませんが、これはネイティブSQLに変換されているだけなので、HQLでこれを実現する方法はありません。私はそれがスキーマをチューニングすることも可能かもしれないと思う:

http://old.nabble.com/case-insensitive-searching-td17756019.html

関連する問題