Код, который мы используем, прост в этой части поискового запроса:
myCriteria.Add(
Expression.InsensitiveLike("Code", itemCode, MatchMode.Anywhere));
И это прекрасно работает в производственной среде.
Проблема в том, что у одного из наших клиентов есть коды товаров, которые содержат символы%, которым должен соответствовать этот запрос. Результирующий вывод SQL из этого кода похож на:
SELECT ... FROM ItemCodes WHERE ... AND Code LIKE '%ItemWith%Symbol%'
Это ясно объясняет, почему они получают странные результаты при поиске предметов.
Есть ли способ включить экранирование с использованием программных Criteria
методов?
Добавление:
Мы используем слегка старую версию NHibernate, 2.1.0.4000 (текущая на момент написания статьи 2.1.2.4853), но я проверил примечания к выпуску, и там не было упоминания об исправлении. Я не нашел ни одной открытой проблемы в их багтрекере.
Мы используем SQL Server, поэтому я могу очень легко избежать специальных символов (%, _, [и ^) в коде, но суть использования NHibernate состояла в том, чтобы сделать нашу базу данных независимой от движка базы данных, как насколько это возможно.
Ни Restrictions.InsensitiveLike()
, ни HqlQueryUtil.GetLikeExpr()
не экранируют свои входы, и удаление параметра MatchMode
не имеет значения в том, что касается экранирования.
Я нашел кого-то другого , желающего сделать то же самое (три года назад), и было решено добавить перегрузки escapeChar
к методам, которые я упоминал выше (это было "исправлено" в версии 2.0.0.3347). Я добавил комментарий к этой проблеме с просьбой о дальнейшем разрешении.