2014-02-06 48 views
1

我試圖想出一個標準,將檢查某個字符串是否是一種可能的模式之一。多個或在休眠限制使用析取或在相同的字段

例如myField不應當符合以下任一模式:pattern1%pattern2%pattern3%

如果我是做在同一時間這一項,限制看起來像

criteria.add(Restrictions.not(Restrictions.in("myField", "pattern1%"))) 

每個模式。由於有幾個,我想從休眠嘗試disjunction限制,如回答發現here。舉例來說,我們只是說我沒有使用模式,而是等同於一系列固定的字符串。所以我希望有這樣的東西:

criteria.add(
    Restrictions.disjunction() 
     .add(Restrictions.like("myField", "str1")) 
     .add(Restrictions.like("myField", "str2")) 
) 

但是,由於某種原因,這是行不通的。當我把它改爲:

criteria.add( 
    Restrictions.disjunction() 
     .add(Restrictions.like("myField", "str1")) 
     .add(Restrictions.like("anotherField", "str2")) 
) 

它,所以我不知道這是否是因爲脫節不會允許多個條件相同的場。但是,第15.2節中的樣本here與「年齡」字段顯示爲不同。

因此,此刻,我被迫使用

criteria.add(
    Restrictions.in("myField", new String[] {"str1", "str2"}) 
) 

其中只有一半的解決了我的問題,因爲我需要的模式是在那裏的地方。

所以我的問題是,是否有可能使用disjunction或in來檢查一個字符串是否匹配任何可能定義的模式?如果是這樣,怎麼樣?或者,還有更好的方法?

謝謝!

回答

4

你可以嘗試這樣的事情:

criteria.add(Restrictions.disjunction().add(
       Restrictions.or(Restrictions.like("myField", "str1"), 
         Restrictions.like("myField", "str1")))); 

或者,如果有你正在尋找一些圖案,然後這應該工作:

criteria.add(Restrictions.disjunction().add(
        Restrictions.or(Restrictions.like("myField", "%"+"str1"), 
          Restrictions.like("myField", "str1"+"%")))); 

希望這有助於.. !!!