Подтвердить что ты не робот

Разница между Restrictions.like и .ilike в Hibernate Criteria API

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

Нечувствительность к регистру "like", аналогичная оператору Postgres ilic

Это круто. Но у того же класса есть функция 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%"));
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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%"));