2008-09-23 25 views
46

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

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

Спасибо,

Юваль = 8-)

ответ

67

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

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

Спасибо ... не знал, что ilib существует в Hibernate = 8-) – Yuval 2008-09-23 12:51:29

0

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

0

Вы можете посмотреть, как использовать компас для обертки выше lucene.

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

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

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

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

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

3

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

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

В критериях Hibernate restrictions.like (.. .). IgnoreCase()

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

для получения дополнительной информации см некоторой pro hibernate 3 extract и hibernate docs 15.2. Narrowing the result set

+0

Для спящего режима 3.6.1 секция для сужения результирующего набора равна 17.2. [Ссылка] (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#querycriteria-narrowing) – zmf 2011-02-16 22:53:07

+0

Сэр, обе ссылки недействительны. – 2013-10-11 09:05:26

4

Вам также не нужно вводить подстановочные знаки «%». Вы можете передать MatchMode (docs for previous releases here), чтобы указать, как вести себя. START, ANYWHERE, EXACT и END подходят варианты.

9

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

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase()); 
36
Criteria crit = session.createCriteria(Person.class); 
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE); 
List results = crit.list(); 
0

Это также можно сделать с помощью критерия Пример, в пакете 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(); 
} 

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