【问题标题】:How to use Findall(closure) in grails project如何在 grails 项目中使用 Findall(closure)
【发布时间】:2014-03-14 02:51:01
【问题描述】:

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

这是我的域类

class Worker{
    String name
}

这是我的控制器

package main

class SiteController {

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

        [results:results]
    }
}

我正在尝试弄清楚如何使用 findAll(closure) 函数,但我在任何地方都找不到示例,我也无法通过测试来找出答案,我只想找到所有工人按照我放在封闭中的测试标准。

编辑 1

我遇到了另一个问题,出于某种原因,每当我在正则表达式中使用任何特殊字符时,例如 [. * ?] 或其中任何一个,我的 findAll 不返回任何内容。如果我有一个叫“John Smith”的工人,我这样做了

name ==~ /John Smith/

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

name ==~ /John.*/

甚至

name ==~ /John S.ith/

它不起作用,这非常令人困惑,并且正则表达式也可以在 findall 函数之外正常工作,如果您能提供一些对此非常有帮助的见解

【问题讨论】:

  • 您是否在 Grails 控制台中测试过这个查询?如果我没记错的话,正则表达式取决于您使用的数据库。
  • 它不会为我运行,因为它说“Groovy:无法查询属性“它” - 类 main.Worker 上不存在这样的属性。”
  • 如果我删除 it,它会运行,但实际上与它应该匹配的不匹配。我的数据库中有一个名为“John Smith”的工人,但没有任何显示

标签: grails grails-orm


【解决方案1】:

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

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

因此应用于您的查询:

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

【讨论】:

  • 我仍然遇到一些麻烦,由于某种原因,带有特殊字符的正则表达式无法在 findAll 函数中工作,如果您可以检查我对我的问题所做的编辑,那将不胜感激。谢谢!
  • 我认为这取决于您的 SGBD 正则表达式,或者查看 Groovy 的正则表达式。
【解决方案2】:

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

结果 = 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 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2013-02-17
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多