2016-09-08 20 views
1

У меня проблема с нижней и верхней функцией JPA (Hibernate). В моем приложении пользователь должен добавить новый элемент в базу данных, но имя должно быть уникальным. Для этого мне нужно сравнить введенную пользователем строку со строками в базе данных и игнорировать случай, проверяя это.Функции гибернации нижние и верхние не работают на польских специальных символах

К сожалению, поскольку я использую функцию Hibernate для создания всех данных с верхним расположением (для сравнения), все работает отлично, за исключением польских специальных символов, которые остаются неизменными.

Это код, который я использовал для тестирования, чтобы проверить, работает ли он:

TypedQuery<String> query = em.createQuery("SELECT upper(i.name) FROM Item i", String.class); 

for (String name: query.getResultList()) 
    System.out.println(name); 

И вот что я получаю:

  • CZYSTY BANDAż
  • mały Chemik
  • MAILY MECHANIK
  • SPRZęT
  • ŚPIWóR
  • ŚRODEK DEZYNFEKUJąCY
  • ŚRODEK CZYSZCZąCY

Все буквы должны быть в верхнем регистре. В базе данных каждая первая буква первого слова всегда заглавная. Проблема касается таких символов, как: ą, ę, ż, ź, ó, ł - они должны выглядеть как Ą, Ę, Ż, Ź, Ó, Ł, но Hibernate, похоже, не распознает их как один символ которая отличается только по отношению к делу.

То же самое происходит, когда я использую нижнюю функцию. Польские символы вообще не затрагиваются и остаются неизменными.

Я не знаю, относится ли это только к польским или другим языкам.

Буду очень признателен за любые намеки в этом вопросе.

EDIT: Я использую Hibernate 5.2.2 Final с базой данных SQLite и драйвером Xerial 3.8.11.2.

EDIT2: То же самое происходит, если я попытаюсь достичь этого, используя собственный SQL-запрос с Hibernate.

+0

какая версия вы используете? –

+0

@khalilM Я использую Hibernate 5.2.2 Final и Xerial 3.8.11.2 с базой данных SQLite :) – Bloodlex

+0

но «ł» отлично работает? –

ответ

0

Я уже нашел решение. Оказалось, что SQLite не поддерживает сортировку Unicode. Он может поддерживать только латинские символы ASCII, используя нижнюю, верхнюю функцию или сортировку.

Существует расширение (расширение ICite ICU), что SQLite необходимо скомпилировать для использования сортировки Unicode (или других сопоставлений), но, насколько мне известно, это не так простое решение, как хотелось бы это будет. Я решил изменить поставщика базы данных на H2, который по умолчанию поддерживает сортировку Unicode без каких-либо изменений, и теперь он работает как шарм :)

Так что это не ошибка Hibernate, а SQLite. Большое спасибо за вашу помощь :)