Нечувствительность к регистру равна критерию гибернации

Я видел Restrictions.ilike('свойство', '% value%'), но хотел бы генерировать SQL как: lower (property) = 'value'. Любые идеи?

Я использовал:

Restrictions.eq("email", email).ignoreCase()

так как выражение устарело. ПростойExpression вызовет toLowerCase() для значения, поэтому нет необходимости делать это заранее.

Смотрите: Источник простого выражения

Ответ 1

Будьте осторожны с использованием ilike, потому что это позволит кому-то вводить такие вещи, как "test%" и соответствовать. Я использую следующее, чтобы сделать регистр без учета регистра равным в одном приложении:

...
Criteria crit=session.createCriteria(Event.class);
crit.add(Expression.eq("rsvpCode","test1").ignoreCase());
...

Ответ 2

Выражение теперь устарело. Вместо этого используйте ограничения...

crit(Restrictions.eq("firstName", firstName).ignoreCase());

Ответ 3

Как говорит Энди, это для запросов, нечувствительных к регистру, но также работает до версии Hibernate 4.1:

crit(Restrictions.eq("firstName", firstName).ignoreCase());

Версии 4.1.1 и более поздние из Hibernate не поддерживают метод ignoreCase() на Restriction.eq(). Для этого мы должны использовать ilike с MatchMode.

Criteria crit = session.createCriteria(ENTITY.class);
crit.add(Restrictions.ilike('PROPERTY NAME', 'VALUE', MatchMode.ANYWHERE));

В качестве примера для объекта USER с свойствами id, name, surname поиск без учета регистра по имени будет выглядеть следующим образом:

Criteria crit = session.createCriteria(USER.class);
crit.add(Restrictions.ilike('name', 'Satyam', MatchMode.ANYWHERE));

Это вернет все результаты, нечувствительные к регистру.

Ответ 4

Я не совсем уверен, но когда вы используете Restriction.eq, вы получаете объект SimpleExpression, и этот объект поддерживает операцию ignoreCase(), которую я никогда не пробовал использовать, но похоже, что это может иметь значение.

Пребывание в Hibernate для того, чтобы не документировать, что на самом деле делает этот метод.

Ответ 5

crit(Restrictions.eq("firstName", firstName).ignoreCase()); работает.

Это возвращает значение SimpleExpression Object, но оно генерирует запрос lower(firstname). Так что это работает.