Настройте Hibernate, чтобы избежать подчеркивания в предложении LIKE, используя диалект SQL Server

У меня есть запрос SQL SELECT, в котором есть предложение LIKE, содержащее подчеркивание, которое должно специально искать подчеркивание, а не рассматривать его как подстановочный знак:

SELECT * FROM my_table WHERE name LIKE '_H9%';

Я понимаю, что могу изменить фактическое предложение на «[_] H9%», чтобы это работало так, как я ожидал, но проблема в том, что это предложение создается Hibernate.

Есть ли способ настроить Hibernate таким образом, чтобы избежать всех подчеркиваний во всех запросах? В противном случае есть ли способ настроить SQL Server (в моем случае 2008), чтобы нет обрабатывал подчеркивания как подстановочные знаки?

Какой API вы используете с Hibernate (например, Criteria Query, HQL и т. д.)? Будет полезно, если вы предоставите часть конфигурации кода / гибернации.

FoxyBOA 18.11.2008 08:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
8 318
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему нельзя выполнить замену строки в значении? Как это используется, чтобы это решение было неработоспособным?

Ответ принят как подходящий

Если вы используете 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("!", "!!");

Другие вопросы по теме