У меня есть запрос SQL SELECT, в котором есть предложение LIKE, содержащее подчеркивание, которое должно специально искать подчеркивание, а не рассматривать его как подстановочный знак:
SELECT * FROM my_table WHERE name LIKE '_H9%';
Я понимаю, что могу изменить фактическое предложение на «[_] H9%», чтобы это работало так, как я ожидал, но проблема в том, что это предложение создается Hibernate.
Есть ли способ настроить Hibernate таким образом, чтобы избежать всех подчеркиваний во всех запросах? В противном случае есть ли способ настроить SQL Server (в моем случае 2008), чтобы нет обрабатывал подчеркивания как подстановочные знаки?




Почему нельзя выполнить замену строки в значении? Как это используется, чтобы это решение было неработоспособным?
Если вы используете Criteria для создания запроса, вы можете создать собственное выражение, подклассы org.hibernate.criterion.LikeExpression, используя один из защищенных конструкторов, который принимает 'Character escapeChar' и выполняет замену значения за вас. При условии, что '!' - известное значение, которого не будет ни в одной строке поиска (я думаю, вы можете выбрать любое, что вам нравится), вы можете просто сделать:
public class EscapingLikeExpression extends LikeExpression {
public EscapingLikeExpression(String propertyName, String value) {
super(propertyName, escapeString(value), '!', false);
}
static String escapeString(String inputString) {
inputString = inputString.replace("_", "!_");
return inputString;
}
}
если таких символов НЕТ (которые не будут отображаться в вашем поисковом значении как литералы), добавьте следующую строку в качестве первой строки escapeString (), чтобы избежать и их:
inputString = inputString.replace("!", "!!");
Какой API вы используете с Hibernate (например, Criteria Query, HQL и т. д.)? Будет полезно, если вы предоставите часть конфигурации кода / гибернации.