我有一个简单的Tag类,只有两个字段,名称和值,
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 :(得分:2)
对于您的多字段ilike
查询,您可以使用withCriteria
:
def result = Tag.withCriteria {
ilike('name', "%${params.name}%")
ilike('value', "%${params.value}%")
}
这将返回Tag
个域名列表,其名称与提供的名称相匹配,值与提供的值相匹配。
Criteria DSL可能会让您完成所需的大部分过滤,但您也可以考虑使用一些Groovy collection examples here。
答案 1 :(得分:1)
您必须在动态查找程序的每个字段上放置限制(InList,NotNull等)。如果不这样做,则假定等于。以下是您要找的内容:
Tag.findAllByNameIlikeAndValueIlike("%${params.name}%", "%${params.value}%")
答案 2 :(得分: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