2011-07-28 11 views
0

I次のクエリをしました:HQLクエリーを無視アクセント

select u from User u where upper(u.name) like upper(?1) 

これは次のようになりますどのように、しかしu.name?1でアクセントを無視して?

ありがとうございました!

+0

あなたの質問を詳しく教えてください...あなたは比較からアクセント記号を削除しようとしていますか? –

+0

データベース内のパラメータと値の両方のアクセント付き文字を、相談中に無視することをお勧めします。 –

+0

私はそれがデータベース側で行うことができますか分かりません。 Java側で実行可能にする必要があります(クエリを送信する前にアクセントを削除します)。ただし、ベースライブラリ(java.util.text)に関連するものは見つかりませんでした。すべてのアクセント付き文字のマップを対応する「プレーン」文字で作成する必要があります。私はそれが既に行われていないことに驚くだろう。 – toto2

答えて

0

あなたはどのデータベースを使用していますか?ほとんどの場合、特定のSQLコマンドを送信して照合順序を設定できます。

+0

私はPostgresを使用しています。 –

0

私はこれを実装する方法を見つけました。

オリジナルHQLクエリ

public User getByName(String paramName) { 
    ..... 
} 

DB から

  1. は(あなたのケース1)のパラメータを正規化し、
  2. は、データを正規化:基本的に2つの段階であります:

    String queryString = "select u from User u where u.name : =paramName"; 
    

    新規クエリ:

    paramName = normalizer(paramName); 
    
    String queryString = "select u from User u where " + replacer(u.name) +" : =paramName"; 
    

    そして、2つの方法:ポルトガル語

    public static String normalizer(String s) { 
        return Normalizer.normalize(s, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""); 
    } 
    
    public String replacer(String param) { 
        String t1 = "àâäçéèëêùûüôöïî"; 
        String t2 = "aaaceeeeuuuooii"; 
        String s = param; 
        for (int i = 0; i < t1.length(); i++) { 
         s = "replace(" + s + ",'" + t1.charAt(i) + "','" + t2.charAt(i) + "')"; 
        } 
        return s; 
    } 
    
0

、私はいくつかの文字でアクセントを逃したので、私は代用の方法で複数の文字を追加しました:

public String replacer(String param) { 
    String t1 = "áãàâäçéèëêùûüúóôöïîíÁÀÂÄÃÇÉÈËÊÙÛÜÚÓÔÖÏÎÍ"; 
    String t2 = "aaaaaceeeeuuuuoooiiiAAAAÃCEEEEUUUUOOOIII"; 
    String s = param; 
    for (int i = 0; i < t1.length(); i++) { 
     s = "replace(" + s + ",'" + t1.charAt(i) + "','" + t2.charAt(i) + "')"; 
    } 
    return s; 
}