2011-07-28 170 views
0

我有以下查詢: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

我找到了一種方法來實現這一點。基本上有兩個步驟:

  1. 標準化參數(在你的情況1)和
  2. 正常化從DB

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

原始HQL查詢數據:

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; 
}