Разница между Restrictions.like и .ilike в Hibernate Criteria API - PullRequest
22 голосов
/ 01 марта 2011

API-интерфейс Hibernate Criteria имеет функцию Restrictions.ilike, которая имеет следующий контракт:

Независимо от регистра "like", аналогично оператору Postgres ilike

Это круто.Но тот же класс также имеет функцию like, имеющую гораздо более расплывчатый контракт:

Примените ограничение "like" к названному свойству

пример

Criteria cr = session.createCriteria(Employee.class);

// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));

// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));

Ответы [ 4 ]

12 голосов
/ 02 марта 2011

Чувствительность к регистру оператора like в MySQL зависит от типа столбцов и их параметров сортировки (см. http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html).

Hibernate - это просто слой поверх SQL. Контракт с оператором like заключается в выдаче SQL-оператора like. Если вы хотите, чтобы это было одинаково для MySQL и PostgreSQL, выберите правильные типы и параметры сортировки в схемах базы данных. Но Hibernate не может волшебным образом заставить все базы данных использовать одни и те же правила.

Создайте свое приложение, выберите и спроектируйте свою базу данных таким образом, чтобы поведение, которое вы наблюдаете, соответствовало ожидаемому.

PS: но я согласен, что Javadoc Hibernate ... совершенен.

1 голос
/ 05 сентября 2017

ilike будет меньше вашего входного значения и меньше значения столбца, например

select * from table where lower(column) like lower(?)

0 голосов
/ 15 ноября 2014

Criteria API Hibernate имеет функцию Restrictions.ilike, которая имеет следующий контракт:

A case-insensitive "like", similar to Postgres ilike operator

Это круто.Но у того же класса также есть функция like, имеющая гораздо более расплывчатый контракт:

Apply a "like" constraint to the named property

пример

Criteria cr = session.createCriteria(Employee.class);

// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));

// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
0 голосов
/ 02 июля 2012

В PostgreSQL есть разные операторы 'ILIKE' и 'LIKE', Таким образом, чувствительность к регистру не зависит от свойств столбца, поэтому это происходит

...