2015-06-15 132 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