我有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
中的一个元素。我想针对search
(query
&#39; s User
字段)对所有type
元素执行搜索操作。
我怎样才能实现这一目标?除了我的解决方案,还有什么简单的方法吗?
提前致谢。
答案 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)}