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

如何在grails项目中使用Findall(closure),grails,gorm,Grails,Gorm,我一直在尝试将搜索功能添加到我的grails项目中,但遇到了一些障碍 这是我的域类 class Worker{ String name } 这是我的控制器 package main class SiteController { def search() { def results = Worker.findAll{ it.name ==~ /.*John.*/ } [results:resul

我一直在尝试将搜索功能添加到我的grails项目中,但遇到了一些障碍

这是我的域类

class Worker{
    String name
}
这是我的控制器

package main

class SiteController {

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

        [results:results]
    }
}
我试图找出如何使用findAll(closure)函数,但我在任何地方都找不到示例,也无法通过测试找到它,我只想根据我在闭包中输入的测试标准找到所有工作人员

编辑1

我有另一个问题,出于某种原因,每当我在正则表达式中使用任何特殊字符,如[.*?]或其中任何字符时,我的findAll都不会返回任何内容。如果我有一个叫“约翰·史密斯”的工人

name ==~ /John Smith/
它正常工作,但如果我使用任何特殊字符,例如

name ==~ /John.*/
甚至

name ==~ /John S.ith/
这是行不通的,这是非常混乱的,regex也在findall函数之外正常工作,如果您能对此提供一些见解,这将非常有帮助。

示例显示您直接引用属性:

// Use where criteria (since Grails 2.0)
def results = Person.findAll {
     lastName == "Simpson"
}
因此,应用于您的查询:

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

请改为在查询中使用LIKE,尝试以下操作:

结果=Person.findAllByLastNameLike(“%John%”)

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

results=Person.findAll(“从Person作为p,其中p.lastName类似于:p.lastName按p.lastName排序”, [姓氏:'%John%'])

要查找HQL查询中的数据,请执行以下操作:


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

您在Grails控制台中测试过这个查询吗?如果我没有弄错的话,正则表达式依赖于您正在使用的数据库。它不会为我运行,因为它说“Groovy:Cannot query property”It”-类main.Worker上不存在这样的属性。“如果我删除它,它会运行,但它实际上与它应该运行的不匹配。”。我的数据库中有一个名为“John Smith”的工作人员,但没有任何显示我仍然有一些问题,出于某种原因,带有特殊字符的正则表达式在findAll函数中不起作用,如果您能检查我对我的问题所做的编辑,我将不胜感激。谢谢我认为这取决于你的SGBD正则表达式,或者看看Groovy的正则表达式。