如何以Groovier方式查询?

时间:2012-01-06 02:17:00

标签: grails groovy

我有User类,其中有一个字段type,而该字段又是一个列表。

所以type可能如下:["a","b"]

我还有另一个列表,比如search ["c","b"](这是预先定义的)

现在我想要的是搜索所有我的User个实例,以便找到与type中的任何一个元素匹配的用户search

我想出了一个部分解决方案:

def newQ = User.findAllByUsernameIsNotNull()
newQ.each { eachIndex ->
                    query = eachIndex.type
                    result = query.findAll { it == "c" }
                    if(result.size() > 0 )
                    {
                        ans << eachIndex.username
                    }
                  }

以上代码有效,ans列表包含满足我条件的所有User。但是你可以清楚地看到query.findAll行,我只搜索search中的一个元素。我想针对searchquery&#39; s User字段)对所有type元素执行搜索操作。

我怎样才能实现这一目标?除了我的解决方案,还有什么简单的方法吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

def ans = []
search.each{s->
    ans += User.findAll("from User u where u.username is not null and ? in elements(u.type)",[s])
}

我想不出在单个查询中执行此操作的方法

答案 1 :(得分:0)

User.withCriteria {
  isNotNull("username")
  'in' ("type", search)
}

答案 2 :(得分:0)

搜索时,您希望尽可能少地访问数据库,因为这些操作通常是最昂贵的操作。如果User.withCriteria {..}有效,我会使用它(我不熟悉.withCriteria {})。如果您仍然想使用动态查找器,这也可以使用,因为mockDomain不能与HSQL一起使用(再次不确定.withCriteria {}是否可以与mockDomain一起使用)。

def search = ["c", "b"]
def users = User.findAllByUsernameIsNotNull()
users = users.findAll {it.type.intersect(search)}