HQL-запрос, игнорирующий акценты - PullRequest
0 голосов
/ 28 июля 2011

У меня следующий запрос:

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

Как это было бы, но игнорируя акценты в u.name и ?1?

Спасибо, ребята!

Ответы [ 3 ]

0 голосов
/ 25 июня 2014

Я нашел способ реализовать это. В основном есть 2 шага:

  1. нормализуйте параметр (в вашем случае 1) и
  2. нормализовать данные из БД

Пример

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 голосов
/ 03 мая 2017

В португальском я пропустил акценты в некоторых символах, поэтому я добавил больше символов в методе замены:

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;
}
0 голосов
/ 29 июля 2011

Какую базу данных вы используете? В большинстве из них вы можете отправить определенную команду SQL для установки параметров сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...