Для этого вопроса мы хотим избежать необходимости писать специальный запрос, поскольку запрос должен быть разным для нескольких баз данных. Используя только критерии спящего режима, мы хотим избежать специальных символов.
Эта ситуация является причиной необходимости избегать специальных символов:
Предположим, что в базе данных есть таблица 'foo'. Таблица 'foo' содержит только 1 поле, называемое 'name'. Поле "имя" может содержать символы, которые могут считаться специальными в базе данных. Два примера такого имени: "имя_1" и "имя% 1". И "_", и "%" являются специальными символами, по крайней мере, в Oracle. Если пользователь хочет выполнить поиск одного из этих примеров после их ввода в базу данных, могут возникнуть проблемы.
criterion = Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE);
return findByCriteria(null, criterion);
В этом коде "searchValue" - это значение, которое пользователь дал приложению для его поиска. Если пользователь хочет найти "%" , пользователь будет возвращен с каждой записью "foo" в базе данных. Это потому, что символ "%" представляет собой подстановочный знак "любое количество символов" для сопоставления строк, а код SQL, который производит спящий режим, будет выглядеть так:
select * from foo where name like '%'
Есть ли способ сказать спящий режим для выхода из определенных символов или создать обходное решение, не относящееся к конкретному типу базы данных?