Поиск без учета регистра с использованием Hibernate - PullRequest
47 голосов
/ 23 сентября 2008

Я использую Hibernate для ORM моего приложения Java для базы данных Oracle (не то, чтобы поставщик базы данных имел значение, мы можем переключиться на другую базу данных однажды), и я хочу получать объекты из базы данных в соответствии с предоставленной пользователем строки. Например, при поиске людей, если пользователь ищет людей, которые живут во «франке», я хочу иметь возможность дать своих людей в Сан-Франциско.

SQL не моя сильная сторона, и я предпочитаю Criteria строительный код Hibernate жестко закодированным строкам. Может кто-нибудь указать мне правильное направление о том, как сделать это в коде, и, если невозможно, как должен выглядеть жестко запрограммированный SQL?

Спасибо

Ювал = 8 -)

Ответы [ 8 ]

70 голосов
/ 23 сентября 2008

Для простого описанного вами случая посмотрите Restrictions.ilike (), который выполняет поиск без учета регистра.

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
36 голосов
/ 14 ноября 2008
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();
9 голосов
/ 22 октября 2008

Если вы используете Spring HibernateTemplate для взаимодействия с Hibernate, вы можете выполнить поиск без учета регистра по адресу электронной почты пользователя:

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
4 голосов
/ 23 сентября 2008

Вам также не нужно вводить символы подстановки '%'. Вы можете передать MatchMode ( документы для предыдущих выпусков здесь ), чтобы сообщить поиску, как себя вести. START, ANYWHERE, EXACT и END совпадения - варианты.

4 голосов
/ 23 сентября 2008

Обычный подход к игнорированию регистра заключается в преобразовании значений базы данных и входного значения в верхний или нижний регистр - результирующий sql будет выглядеть примерно так:

select f.name from f where TO_UPPER(f.name) like '%FRAN%'

В критериях гибернации ограничения. Like (...). IgnoreCase ()

Я больше знаком с Nhibernate, поэтому синтаксис может быть не точным на 100%

для получения дополнительной информации см. pro hibernate 3 extract и hibernate docs 15.2. Сужение результирующего набора

0 голосов
/ 03 ноября 2010

Это также можно сделать с помощью критерия Пример в пакете org.hibernate.criterion.

public List findLike(Object entity, MatchMode matchMode) {
    Example example = Example.create(entity);
    example.enableLike(matchMode);
    example.ignoreCase();
    return getSession().createCriteria(entity.getClass()).add(
            example).list();
}

Просто еще один способ, который я считаю полезным для достижения вышеизложенного.

0 голосов
/ 23 сентября 2008

Вы можете посмотреть на использование Compass выше lucene.

http://www.compass -project.org /

Добавив несколько аннотаций к объектам вашего домена, вы добьетесь таких результатов.

Compass предоставляет простой API для работы с Lucene. Если вы знаете, как использовать ORM, то с Compass вы будете чувствовать себя как дома с простыми операциями сохранения, удаления и запроса.

С самого сайта. «Основываясь на Lucene, Compass упрощает общие шаблоны использования Lucene, такие как поиск в стиле google, обновления индексов, а также более продвинутые концепции, такие как кэширование и разбиение индекса (подиндексы). Compass также использует встроенные оптимизации для одновременных коммитов и сливает ".

Я использовал это в прошлом, и я нахожу это здорово.

0 голосов
/ 23 сентября 2008

Большинство параметров сортировки базы данных по умолчанию не чувствительны к регистру, но в мире SQL Server его можно установить на уровне экземпляра, базы данных и уровня столбца.

...