Hibernate + Postgresql с поиском без учета регистра - PullRequest
4 голосов
/ 08 февраля 2010

Я искал простое решение для того, чтобы наша новая установка postgresql + hibernate работала с поиском без учета регистра, но не повезло. Ранее мы использовали mysql, в котором есть политика поиска без учета регистра, однако в Postgresql этого, похоже, нет.

Например, я бы хотел, чтобы Hibernate / Postgresql возвращал один и тот же результат для каждого из приведенных ниже:

SELECT * FROM Foo where bar = 'Hello World';

и

SELECT * FROM Foo where bar = 'hello wOrlD';

Единственное решение, которое я нашел, - это как-то встроить ключевое слово ilike в результирующие запросы, однако вы думаете, что в Hibernate есть какая-то конфигурация, которая бы отвечала этому? Мой опыт работы с Hibernate и Postgresql ограничен, поэтому мы будем признательны за любой вклад.

Спасибо

Ответы [ 4 ]

2 голосов
/ 08 февраля 2010

В SQL я уже использовал хитрость, которая, на мой взгляд, совместима с SQL в большинстве СУБД:

SELECT * FROM UPPER(bar) = 'HELLO WORLD'

Вы можете использовать заглавные буквы перед передачей параметра. Вероятно, это будет то же самое, что и использование Restrictions.ilike () критерий для запроса в Hibernate.

0 голосов
/ 11 февраля 2010

Спасибо за оба ваших ответа; Кажется, нет простого способа обойти эту проблему на уровне базы данных / jdbc. Таким образом, наше решение здесь было, хотя и не оптимальным:

  1. Обеспечить соблюдение стандартов обсадных труб в логических данных.
  2. Когда мы получаем запросы от клиента, строка запроса фильтруется с помощью функции toLowerCase ().

Когда мы использовали mysql, это было просто вопросом установки политики в my.cfg / ini - я не понимаю, почему она стала более сложной в postgresql. Такова жизнь, а?

0 голосов
/ 08 февраля 2010

Spring может быть удобен при настройке таких вещей, как соединение hibernate и postgres, транзакция (при необходимости) и способ получения объекта HibernateSession. Фактически, используя spring, вы можете использовать HibernateTemplates (объект Spring), который будет прокси-сервер для вас.

Тем не менее, у вас все еще есть способность программы определять, какие запросы вы выполняете. В этом случае, используя HibernateTemplate, вы можете написать:

String parameter = "hello wOrlD"
DetachedCriteria criteria = DetachedCriteria.forClass(objectClass)
                             .add(Restrictions.ilike("name", parameter)));
List<Object> result = template.findByCriteria(criteria);

или вы можете использовать Restrictions.eq или sqlRestriction для его реализации.

0 голосов
/ 08 февраля 2010

Нет способа просто сказать Postgres игнорировать регистр .

Если вы хотите изменить тип всех столбцов, для которых необходимо это сравнение, посмотрите на тип данных citext .

...