0

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

3 回答 3

2

对于您的多字段ilike查询,您可以使用withCriteria

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

这将返回Tag名称与提供的名称匹配值与提供的值匹配的域列表。

Criteria DSL可能会让您完成大部分所需的过滤,但您也可以考虑使用此处的一些 Groovy 集合示例

于 2012-12-05T20:54:55.163 回答
1

Both answer are good. I tried both, but I have to say I like the withcCritia the best. It seems very flexibly.

    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
于 2012-12-09T13:46:58.703 回答
1

您必须在动态查找器的每个字段上设置限制(InList、NotNull 等)。如果你不这样做,它假定等于。这是您要查找的内容:

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

于 2012-12-06T01:39:20.903 回答