如何在grails项目中使用Findall(closure)

时间:2014-03-14 02:51:01

标签: grails gorm

我一直在尝试为我的Grails项目添加搜索功能,而且我遇到了一些障碍。

这是我的域名

class Worker{
    String name
}

这是我的控制器

package main

class SiteController {

    def search()
    {
        def results = Worker.findAll{
            it.name ==~ /.*John.*/
        }

        [results:results]
    }
}

我试图找出如何使用findAll(闭包)功能,但我无法在任何地方找到示例,我也无法通过测试来解决这个问题,我只是我希望按照我在关闭时的测试标准找到所有工人。

编辑1

由于某些原因,我在我的正则表达式中使用任何特殊字符时会出现其他问题,例如[。 *?]或其中任何一个,我的发现都不会返回任何东西。如果我的工作人员名字是" John Smith"我做了

name ==~ /John Smith/

它可以正常工作,但如果我使用任何特殊字符,如

name ==~ /John.*/

甚至

name ==~ /John S.ith/

它不会起作用,这是非常令人困惑的,正则表达式应该在findall函数之外,如果你能提供一些非常有帮助的洞察力

2 个答案:

答案 0 :(得分:4)

示例in the docs显示您直接引用该属性:

// Use where criteria (since Grails 2.0)
def results = Person.findAll {
     lastName == "Simpson"
}

因此适用于您的查询:

def results = Worker.findAll{
  name ==~ /.*John.*/
}

答案 1 :(得分:2)

请在查询中使用LIKE,试试这个:

  

results = Person.findAllByLastNameLike(“%John%”)

Grails在下面使用hibernate,它使用类似于SQL的HQL语言。或者,您也可以运行完整查询

  

results = Person.findAll(“from person as p where p.lastName LIKE:lastname order by p.lastName”,                [姓氏:'%John%'])

寻找HQL查询: http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/queryhql.html

令人遗憾但是真的,HQL / SQL不支持正则表达式,它只支持LIKE子句。