Hibernate, ilike, русские буквы?

Привет. Есть следующий код:
Restrictions.ilike("lastName", lastName, MatchMode.ANYWHERE);


Проблема в следующем.

Искомое слово: Иванов

Строка для поиска: и, ив, ива, иван, иванов

Результат: искомое слово не найдено

Строка для поиска: в, а, н, о, в, ва, ан, ано, нов, анов, ван, вано, ванов, ов

Результат: искомое слово найдено.

Искомое слово: иванов

Строка для поиска: любая

Результат: искомое слово найдено.

Искомое слово: Malkovich

Строка для поиска: m, ma, mal, malk, malko, malkov, malkovi, malkovic, malkovich

Результат: искомое слово найдено.

Получается что если я ищу русское слово, которое начинается с большой буквы, и ищу его начиная с первой буквы, оно не находится.

Даже если метод поиска MethodMatch.ANYWHERE я заменю на MethodMatch.START оно не начнет находится.
  • Вопрос задан
  • 3090 просмотров
Решения вопроса 1
@NightFantom
Если я правильно понимаю, то ты не так ищешь. Надо так Restrictions.like("lastName", "%"+ СЛОВО +"%") В SQL команда like ищет сходство с шаблоном. В шаблоне допускается маски. % означает любую последовательность символов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bobzer
Java EE Developer
Я бы посоветовал для начала погонять все запросы без Hibernate, а напрямую в БД и посмотреть на результаты. Либо почитать доку/погуглить насчет того, как работает ваша СУБД с регистром символов. Например, Oracle обязует указывать в условии тот же регистр, что и в БД (иначе не найдёт), а MySQL позволяет об этом не задумываться. Надежнее всего перед сохранением данных в БД приводить регистры символов в некое предопределенное состояние (например все символы в верхний регистр), а впоследствии при наложении условия на выборку также приводить регистр искомой строки. Если в базе уже мусор (кто как ввел, так и сохранилось) то можно создать индексы в нужном регистре, т.е. в поле таблицы как попало, а в индексе по этому полю всё в UPPER. Либо сделать update table set field = UPPER(field). В общем сначала смотрите в СУБД, а уже потом в Hibernate...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы