Регистронезависимый поиск с помощью Hibernate

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

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

спасибо,

Юваль =8-)

8 ответов


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

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();

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

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());

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


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

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

в условиях спящего режима ограничения критериев.любить.(..).параметром ignorecase()

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

для получения дополнительной информации см. pro hibernate 3 экстракт и hibernate docs 15.2. Сужение результата set


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


можно использовать компас обертка над Лудене.

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

добавив несколько аннотаций к объектам домена, вы получите достижение такого рода вещей.

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

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

Я использовал это в прошлом, и я считаю это здорово.


Это также можно сделать, используя пример критерия в организации.зимовать.пакет критериев.

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();
}

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