【问题标题】:Configure Hibernate to escape underscores in LIKE clause using SQL Server dialect使用 SQL Server 方言配置 Hibernate 以转义 LIKE 子句中的下划线
【发布时间】:2010-09-22 16:27:20
【问题描述】:

我有一个 SQL SELECT 查询,它有一个包含下划线的 LIKE 子句,它应该专门查找下划线,而不是将其视为通配符:

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

我知道我可以将实际子句更改为 '[_]H9%' 以使其按预期工作,但问题是该子句是由 Hibernate 生成的。

有没有办法配置 Hibernate 以这种方式转义所有查询中的所有下划线?如果做不到这一点,有没有办法将 SQL Server(在我的例子中是 2008 年)配置为将下划线视为通配符?

【问题讨论】:

  • 您在 Hibernate 中使用哪个 API(即 Criteria Query、HQL 等)?如果您提供部分代码/休眠配置,这将很有帮助。

标签: java sql sql-server hibernate


【解决方案1】:

如果您使用 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("!", "!!");

【讨论】:

    【解决方案2】:

    为什么不能对值进行字符串替换?这是如何使用的,所以这是一个不可行的解决方案?

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多