Поиск без учета регистра с использованием Hibernate
-
02-07-2019 - |
Вопрос
Я использую Hibernate для ORM моего Java-приложения в базе данных Oracle (не то, чтобы поставщик базы данных имел значение, однажды мы можем переключиться на другую базу данных), и я хочу извлекать объекты из базы данных в соответствии со строками, предоставленными пользователем.Например, при поиске людей, если пользователь ищет людей, живущих во Франции, я хочу иметь возможность указать ей людей в Сан-Франциско.
SQL не моя сильная сторона, я предпочитаю Hibernate. Criteria
создание кода для жестко закодированных строк как есть.Может ли кто-нибудь указать мне правильное направление, как это сделать в коде, и, если невозможно, как должен выглядеть жестко запрограммированный SQL?
Спасибо,
Юваль =8-)
Решение
В описанном вами простом случае посмотрите Restrictions.ilike(), который выполняет поиск без учета регистра.
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();
Если вы используете HibernateTemplate Spring для взаимодействия с Hibernate, вот как вы можете выполнить поиск без учета регистра по адресу электронной почты пользователя:
getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
Вам также не нужно вводить подстановочные знаки «%».Вы можете пройти Режим матча (документы для предыдущих выпусков здесь) чтобы рассказать поиску, как себя вести. START
, ANYWHERE
, EXACT
, и END
совпадения — это варианты.
Обычный подход к игнорированию регистра состоит в преобразовании как значений базы данных, так и входного значения в верхний или нижний регистр - результирующий sql будет иметь что-то вроде
select f.name from f where TO_UPPER(f.name) like '%FRAN%'
В критериях спящего режима ограничения.like(...).ignoreCase()
Я больше знаком с Nhibernate, поэтому синтаксис может быть не на 100% точным.
дополнительную информацию см. экстракт из pro hibernate 3 и документы гибернации 15.2.Сужение набора результатов
Большинство параметров сортировки базы данных по умолчанию не чувствительны к регистру, но в мире SQL Server их можно установить на уровне экземпляра, базы данных и столбца.
Вы можете посмотреть использование Compass в оболочке над lucene.
http://www.compass-project.org/
Добавив несколько аннотаций к объектам вашего домена, вы добьетесь такого же результата.
Compass предоставляет простой API для работы с Lucene.Если вы знаете, как использовать ORM, то вы будете чувствовать себя как дома с Compass с простыми операциями сохранения, удаления и запроса.
С самого сайта.«Основываясь на Lucene, Compass упрощает общие шаблоны использования Lucene, такие как поиск в стиле Google, обновления индексов, а также более сложные концепции, такие как кэширование и сегментирование индекса (подиндексы).Compass также использует встроенные оптимизации для одновременной фиксации и слияния».
Я использовал это в прошлом, и я считаю, что это здорово.
Это также можно сделать с помощью примера критерия в пакете 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();
}
Это еще один способ, который я считаю полезным для достижения вышеизложенного.