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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 08 января 2009

Если вы используете Criteria для создания запроса, вы можете создать свое собственное выражение, которое подклассов org.hibernate.criterion.LikeExpression, используя один из защищенных конструкторов, который принимает в качестве символа 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("!", "!!");
0 голосов
/ 08 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...