Разница между 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%"));
Ответы
Ответ 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%"));