Java 使用SQL Server方言配置Hibernate以转义LIKE子句中的下划线
我有一个SQL SELECT查询,它有一个包含下划线的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)配置为不将下划线视为通配符?为
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配置,这将非常有用。