java - 使用 SQL Server 方言将 Hibernate 配置为转义 LIKE 子句中的下划线

标签 java sql sql-server hibernate

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

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

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

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

最佳答案

如果您使用 Criteria 创建查询,您可以创建自己的表达式,它是 org.hibernate.criterion.LikeExpression 的子类,使用接受“Character escapeChar”的 protected 构造函数之一,并在值中进行替换为你。假如说 '!'是一个不会出现在任何搜索字符串中的已知值(我想你可以选择任何你喜欢的),你可以这样做:

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("!", "!!");

关于java - 使用 SQL Server 方言将 Hibernate 配置为转义 LIKE 子句中的下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/295771/

相关文章:

java - 多线程java中的一进一出要求与统一服务员要求

php - 根据 PHP 函数值自定义 MySQL Order By

sql - 用户没有访问数据库的权限

sql-server - 长时间运行的查询是否会阻止对相关表的插入?

c# - Entity Framework 连接字符串 utf8

sql - 用于加密数据的存储过程

java - 我如何在执行 HTTPClient 之前检查互联网连接

java - unity调用android java类的静态函数

MySQL 通过列 != x 选择组

Java 多项式加法