2008-11-17 69 views
5

我有一个具有包含下划线,应该专门找一个下划线一个LIKE子句的SQL SELECT查询逃避LIKE子句下划线,而不是把它当作一个通配符:配置Hibernate使用SQL Server方言

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

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

有没有办法配置Hibernate以这种方式转义所有查询中的所有下划线?否则,有没有办法将SQL Server(2008在我的情况下)配置为而不是将下划线视为通配符?

+0

您使用哪种API与Hibernate(即标准查询,HQL等)?如果您提供部分代码/休眠配置,这将会很有帮助。 – FoxyBOA 2008-11-18 05:20:06

回答

5

如果您使用标准创建查询,您可以创建自己的表达,其子类org.hibernate.criterion.LikeExpression,使用受保护的构造函数,它接受“字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("!", "!!"); 
0

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