2016-06-11 4 views
2

動作しない私は、検索HQLクエリを持っています。
大文字と小文字を区別しない検索のため、入力文字列をJavaでも大文字に設定する必要があります。私は文字にeißeを渡すことによって、このエントリを検索しよう:休止状態:<code>Heiße Suppe</code>:私は次の値を持つデータベースで</p> <pre><code>@NamedQuery(name = "Recipe.findByTitle", query = "SELECT r.title FROM Recipe r WHERE UPPER(r.title) LIKE :titlePart") </code></pre> <p>:大文字小文字を区別しない検索が特殊文字

language = "de"; 
characters = "eiße"; 
queryTitle.setParameter("titlePart", "%" + characters.toUpperCase(new Locale(language)) + "%"); 

鋭いS(「ß」)があるため、ドイツ語のロケールでのJavaによるSSに変換されることが、期待されています。しかし、問題は、HQLのUPPERがシャープなSS 'をSSに変換しないため、結果が返されないということです。私は休止状態が特殊文字でUPPERで何をしているのかよく分かりませんが、同じJavaがやっているわけではありません。 (非特殊文字に対してのみ機能します)。
解決策は、両方を小文字に設定することですが、特殊文字を使用する世界のすべての言語でこの機能が動作するのではないか、またはどの言語でもAlwaysLowCaseを使用するソリューションですか?

[UPDATE]
これはすべての言語で機能するのかまだわかりませんが、ギリシャ語の値でいくつかのテストを行いました。ギリシャ語の大文字アルファアルファ(ΑΒΓΔ)をデータベースに挿入しましたが、アルファベットの小文字アルファベット(αβγδ)を検索したところ、結果が見つかりました。データベースが値を適切に下げるので、値を下げるのが一般的な方法かもしれません。私はこれがどんな言語でも機能するかどうか疑問に思います。

+0

あなたはテーブルでどのような照合をしていますか? sqlの大文字小文字の動作は照合に依存します。 –

+0

@MikhailChibel照合は常にen_US.UTF-8です。これは検索にどのような影響を及ぼしますか? – Bevor

+0

私はこれがhqlの問題ではなく、むしろSQL自体であると信じています。 colllationテーブルにない文字がSQLの場合、文字を大文字または小文字に変換する方法がわからないことがあります。これがギリシャのシンボルとドイツ語のために働く理由です。とにかく、sqlで直接問合せを実行することをお勧めします。少なくとも、問題が発生したhqlではないことがわかります。 –

答えて

1

あなたはILIKEいずれかを使用しようとすることができます:休止状態の両方の部品のために

query = "SELECT r.title FROM Recipe r WHERE r.title ILIKE ('%' || :titlePart || '%')" 

やケース変換を:

queryTitle.setParameter("titlePart", characters); 

が、私はケースを変換するためにはお勧めしません

query = "SELECT r.title FROM Recipe r WHERE UPPER(r.title) LIKE ('%' || UPPER(:titlePart) || '%')" 

Javaで - それは調査のエラーのためにハードにつながる...

+0

ILIKEはHQLでは動作しないようですが、2番目の試みはうまくいきます。 – Bevor

+0

追加情報:しかし、 'WHERE LOWER(somevalue)IN(LOWER(:list))で動作しないようです。 '原因:org.postgresql.util.PSQLException:ERROR:function lower )が存在しません ヒント:指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要があるかもしれません。' – Bevor

+0

IN句には、カスタムのストアド・ファンクションが必要です。値リストの大/小文字を変更する(リスト内のすべての項目にUPPERまたはLOWERを適用します)。 – ursa

関連する問題

 関連する問題