У меня есть страница поиска, которая использует введенный пользователем термин для запроса базы данных. Я использую Mybatis 3.4.0 с Spring.
Проблема в том, что Mybatis удаляет все одинарные кавычки в поисковом запросе, вне зависимости от того, экранирую я их или нет. Это допустимые запросы, поскольку пользователь должен иметь возможность искать такие строки, как O'Toole, но ничего не возвращается.
Вот фрагмент кода из картографа. Рассматриваемое поле - caseWhereConditionDTO.value
, а входящее значение, например, O''TOOLE
(вручную экранировано в коде)
<if test="caseWhereConditionDTO.value != null">
${caseWhereConditionDTO.leftExpression}
${caseWhereConditionDTO.operator}
#{caseWhereConditionDTO.value}
${caseWhereConditionDTO.closeConditionString}
</if>
что приводит к предложению where
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'OTOOLE%'
в котором отсутствует двойной сбежавший O''TOOLE
Все работает нормально, когда в маппере я заменяю # на $ и заключаю в одинарные кавычки
'${caseWhereConditionDTO.value}'
в результате получается вывод sql
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'
который дает ожидаемые результаты запроса
но, конечно, я хотел бы сохранить защиту от SQL-инъекций #{}
Итак, мой вопрос: как мне запросить термины с одинарными кавычками, все еще используя защиту SQL-инъекций оператора #{}/prepared?