Вопрос

Я использую 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();
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top