Нечувствительность к регистру равна критерию гибернации
Я видел 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)
. Так что это работает.