Grails找到了我喜欢的多个列

时间:2012-12-05 20:50:58

标签: grails gorm

我有一个简单的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)
}

3 个答案:

答案 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