Grails 如何检查给定列表是否是GORM中字段值的子集?

Grails 如何检查给定列表是否是GORM中字段值的子集?,grails,gorm,Grails,Gorm,我正在研究一种带有可变字段的高级搜索功能。一些搜索字段是一些基本(ish)对象(字符串、枚举等)的列表。我希望能够检索其值是某个给定列表子集的记录 举例来说,假设我有一本书类(假设模型适合这种方式): 此外,假设我们有以下账簿记录: Book(title: 'Great Expectations of Tom Sawyer', authors: ['cdickens', 'mtwain']) Book(title: 'Huckleberry Potter in Bleak House', aut

我正在研究一种带有可变字段的高级搜索功能。一些搜索字段是一些基本(ish)对象(字符串、枚举等)的列表。我希望能够检索其值是某个给定列表子集的记录

举例来说,假设我有一本
类(假设模型适合这种方式):

此外,假设我们有以下账簿记录:

Book(title: 'Great Expectations of Tom Sawyer', authors: ['cdickens', 'mtwain'])
Book(title: 'Huckleberry Potter in Bleak House', authors: ['cdickens', 'mtwain', 'jrowling'])
Book(title: 'A Christmas Carol', authors: ['cdickens'])
然后,我得到了一个作者(姓名)列表
authorFilter=['cdickens','mtwain']
来搜索
cdickens
mtwain
的任何协作作品。如何使用GORM的
where
construct来表达这一点?甚至可以用它来覆盖这个吗

基本上,我想做的是:

Book.where {
    authorFilter.every { it in authors }
}
这个问题已经解决了。不幸的是,其中nor条件查询具有一个等价的
every()
。但是有一个黑客可能对你有用。但首先,我将扩展您的域模型

域模型 HQL查询 使用上述域模型,您可以使用以下HQL查询

def hql = """
SELECT b FROM Book AS b
INNER JOIN b.authors AS a
WHERE a.name in :authors
GROUP BY b
HAVING COUNT(b) = :count
"""

def books = Book.executeQuery(hql, [authors: authorFilter, count: authorFilter.size()])
它是如何工作的。
您可以在我提到的问题中了解此查询是如何工作的。

我认为这并不比@EmmanuelRosa的答案好,但我有另一种使用HQL和
executeQuery
方法的方法

使用他在回答中给出的相同域模型,我使用表达式的
成员来限制结果

def authorFilter = [Author.get(1)]

def authorMemberOfRestriction = ""
def namedParameters = [:]

authorFilter.eachWithIndex{ aut, ind ->
    authorMemberOfRestriction += ":author${ind} MEMBER OF b.authors AND "
    namedParameters.put("author" + ind, aut)
}

namedParameters.put('count', authorFilter.size())

def hql = """
FROM Book b 
WHERE 
(
${authorMemberOfRestriction}
size(b.authors) = :count
)
"""

def books = Book.executeQuery(hql, namedParameters)
我的有些不同,因为
authorFilter
Author
域类实例的集合;我发现它对
表达式的
成员更容易工作,而且更真实地描述了真实数据的建模方式

您可以看到,我使用命名参数两侧的索引,使用
eachWithIndex
构建了
表达式的多个
成员。这不是很漂亮,但我不相信有办法解决这个问题,仍然使用这种方法


我认为@EmmanuelRosa的方法可能是“更干净”的选择,但就逻辑而言,
方法的
成员在我的头脑中更有意义。

除了进行HQL查询之外,似乎没有更简单的方法。根据老师的提示,我想出了解决问题的办法

需要明确的是,
书籍
应该已经与使用
hasMany
结构的多个
字符串
相关:

class Book {
    ...
    static hasMany = [authors: String]
    ...
}
要获取结果,请执行以下操作:

def results = Product.executeQuery("select p from Products p join p.tags t where t in :tags", [tags: givenTags])

就像我说的,让我们假设模型适合我的需要。我真正关心的是字符串和其他类似于原语的对象的列表。这并没有回答最初的问题,它将返回类似于gorm list的结果。任何{}或与在criteria中使用“in”/“inList”相同为什么这个问题被否决?我希望人们至少能解释一下。
class Book {
    ...
    static hasMany = [authors: String]
    ...
}
def results = Product.executeQuery("select p from Products p join p.tags t where t in :tags", [tags: givenTags])