Регистронезависимый поиск с помощью 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();
}
просто еще один способ, который я считаю полезным для выполнения вышеизложенного.