我有一个 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/