2015-06-15 236 views
2

我使用下面的Hibernate代碼來過濾workFlowName休眠條件接受%%值

crt.add(Restrictions.like("workFlowName", workFlow, MatchMode.ANYWHERE)); 
// crt is the criteria 

問題是,當我從網頁(文本框)的值傳遞給工作流程。它獲取正確的值(我在文本框中通過sym如果取10 records.if我通過相同值如%sym%再次獲取相同的記錄)。

當它看到%%作爲參數時,是否忽略該標準?

回答

1

Hibernate不(例如百分比%號)逃避特殊字符。但也有說明如何解決呢(轉義)

一般來說,我們可以實現我們自己的EscapedILikeExpression(取自第一鏈接)

class EscapedILikeExpression extends IlikeExpression { 
    private static final String HIBERNATE_ESCAPE_CHAR = "\\"; 

    public EscapedILikeExpression(String propertyName, Object value) { 
     super(propertyName, value); 
    } 

    public EscapedILikeExpression(String propertyName, String value, MatchMode matchMode) { 
     super(propertyName, replaceAll(value), matchMode); 
    } 

    private static String replaceAll(String value) { 
     return value 
       .replace("\\", HIBERNATE_ESCAPE_CHAR + "\\") 
       .replace("_", HIBERNATE_ESCAPE_CHAR + "_") 
       .replace("%", HIBERNATE_ESCAPE_CHAR + "%"); 

    } 
} 

public class EscapedRestrictions { 
    public static Criterion ilike(String propertyName, String value) { 
     return new EscapedILikeExpression(propertyName, value); 
    } 

    public static Criterion ilike(String propertyName, String value, MatchMode matchMode) { 
     return new EscapedILikeExpression(propertyName, value, matchMode); 
    } 
} 

現在,我們應該能夠調用

crt.add(EscapedRestrictions.ilike("workFlowName", workFlow, MatchMode.ANYWHERE)); 
+0

那麼它是如何獲取的記錄即使通過%符號%。它應該具有空值權限返回? – Karthick

+0

問題是,如果我們想要像%這樣的符號用於過濾...我們必須逃避它們。使用SQL Server,我將它們從%更改爲'[%]'...然後只包含將返回的值。即如果我們在SQL服務器上使用[%] sym [%],只有這些記錄會被找到,因爲它會被轉換成SQL語句'WHERE x like'%[%] sym [%]%'' –

+0

Thanks Radim科勒,現在我明白了。 – Karthick