Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SQL Server方言配置Hibernate以转义LIKE子句中的下划线_Java_Sql_Sql Server_Hibernate - Fatal编程技术网

Java 使用SQL Server方言配置Hibernate以转义LIKE子句中的下划线

Java 使用SQL Server方言配置Hibernate以转义LIKE子句中的下划线,java,sql,sql-server,hibernate,Java,Sql,Sql Server,Hibernate,我有一个SQL SELECT查询,它有一个包含下划线的LIKE子句,该子句应该专门查找下划线,而不是将其视为通配符: SELECT * FROM my_table WHERE name LIKE '_H9%'; 我知道我可以将实际子句更改为'[]H9%',以使其按预期工作,但问题是该子句是由Hibernate生成的 有没有办法将Hibernate配置为以这种方式转义所有查询中的所有下划线?如果做不到这一点,有没有办法将SQL Server(在我的例子中是2008)配置为不将下划线视为通配符?为

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

SELECT * FROM my_table WHERE name LIKE '_H9%';
我知道我可以将实际子句更改为'[]H9%',以使其按预期工作,但问题是该子句是由Hibernate生成的


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

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

如果您使用条件来创建查询,您可以创建自己的表达式,它是org.hibernate.Criteria.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("!", "!!");

您在Hibernate中使用哪种API(即条件查询、HQL等)?如果您提供部分代码/hibernate配置,这将非常有用。