2012-12-05 96 views
0

我有隻有兩個字段,名稱和值的簡單標籤類,Grails的findBy多列iLike的

class Tag { 
    String name 
    String value 
} 

,我試圖渲染XML,我想搜索通過這兩個參數的部分findBy ... iLike的()。

def getXml = { 
    render Tag.findAllByNameAndValueIlike("%${params.name}%", "%${params.value}%") as XML 
} 

但是這並沒有給我任何結果。如果我只用一個參數,它的工作原理如我所料:

def getXml = { 
    render Tag.findAllByNameIlike("%${params.name}%") as XML 
} 

我的下一個問題是可能會是有關篩選結果,並添加其他「類似的」標籤的回報清單,所以是有辦法爲了解決上述的東西,如:

def getXml = { 
    list = Tag.findAllByNameIlike("%${params.name}%") 
    list.add(Some other stuff) 
    list.sortBy(Some thing, maby name length) 
} 
+0

您是否嘗試使用withCriteria方法或條件來處理您的請求? –

回答

2

爲了您的多場ilike查詢,你可以使用withCriteria

def result = Tag.withCriteria { 
    ilike('name', "%${params.name}%") 
    ilike('value', "%${params.value}%") 
} 

這將返回列表Tag其名稱與提供的名稱匹配的域名的值與提供的值匹配。

Criteria DSL可能會讓你做大部分你需要的過濾,但是你也可以考慮使用一些Groovy collection examples here

+0

感謝您的回答。這似乎是一種簡單而靈活的方式。對不起,我也是新來的stackoverflow。看來我必須發表我的答覆作爲一個新的答案:) – user1407209

1

您必須在動態查找器的每個字段上放置限制(InList,NotNull等)。如果你不這樣做,它假設等於。這裏是你要找的人:

Tag.findAllByNameIlikeAndValueIlike("%${params.name}%", "%${params.value}%")

1

兩個答案都不錯。我嘗試了兩種,但我必須說我最喜歡withcCritia。它看起來非常靈活。

def result = Tag.withCriteria { 
     if(params.name != null) 
      ilike('name', "%${params.name}%") 
     if(params.value != null) 
      ilike('value', "%${params.value}%") 
    } 
    result.add(new Tag('name': "something")) 
    render result as XML