2008-11-17 43 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

爲什麼你不能對值進行字符串替換?這是如何使用,這是一個不可行的解決方案?