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

     2023-05-07     293

关键词:

【中文标题】如何检查给定列表是不是是 GORM 中字段值的子集?【英文标题】:How do I check if a given list is a subset of a field value in GORM?如何检查给定列表是否是 GORM 中字段值的子集? 【发布时间】:2016-02-24 19:31:34 【问题描述】:

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

为了说明,假设我有一个Book 类(假设模型适合这种方式):

class Book 
    ...
    List authors = []
    ...

另外说我们有以下书籍记录:

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'] 以搜索cdickensmtwain 的任何合作作品。如何使用 GORM 的 where 构造来表达这一点?甚至可以用它来覆盖这个吗?

基本上,我想做的是:

Book.where 
    authorFilter.every  it in authors 

【问题讨论】:

为什么这个问题被否决了?我希望人们至少能解释一下。 【参考方案1】:

这个问题有come up before。不幸的是, where nor 条件查询具有 every() 等效项。但是有一个技巧可能对你有用。但首先,我将扩展您的域模型。

领域模型

class Book 
    String title

    static hasMany = [authors: Author]
    static belongsTo = Author


class Author 
    String name

    static hasMany = [books: Book]

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()])

它是如何工作的。

您可以在我提到的other 问题中了解此查询的工作原理。

【讨论】:

就像我说的,让我们假设模型适合我的需要。我真正关心的是字符串列表和其他类似原始的对象。 这不回答原始问题,它会返回类似于 gorm list.any 的结果或与在条件中使用“in”/“inList”相同【参考方案2】:

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

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

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)

我的有点不同,authorFilterAuthor 域类实例的集合;我发现 MEMBER OF 表达式更容易工作,而且更真实地描述了如何对真实数据进行建模。

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

我认为@EmmanuelRosa 的方法可能是“更清洁”的选择,但就逻辑而言,MEMBER OF 方法在我的脑海中更有意义。

【讨论】:

【参考方案3】:

除了进行 HQL 查询之外,似乎没有更简单的方法可以做到这一点。从this answer to a very similar question 得到提示,我找到了解决问题的方法。

需要明确的是,Book 应该已经使用 hasMany 构造与许多 String 相关:

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])

【讨论】:

Python - 如何在列表中查找不是最小值的数字

】Python-如何在列表中查找不是最小值的数字【英文标题】:Python-howtofindnumbersinalistwhicharenottheminimum【发布时间】:2013-08-1211:30:04【问题描述】:我有一个列表S=[a[n],b[n],c[n]],对于n=0,列表S的最小值是\'a\'。鉴于我知道最小值,... 查看详情

如何检查给定的字符串是不是是真实单词?

】如何检查给定的字符串是不是是真实单词?【英文标题】:HowcanIcheckifastringgivenisarealword?如何检查给定的字符串是否是真实单词?【发布时间】:2017-07-0302:51:41【问题描述】:我正在制作一个在VisualBasic中解决字谜的程序。如... 查看详情

检查一个数组是不是是另一个数组的子集

】检查一个数组是不是是另一个数组的子集【英文标题】:Checkwhetheranarrayisasubsetofanother检查一个数组是否是另一个数组的子集【发布时间】:2010-09-2421:09:30【问题描述】:知道如何检查该列表是否是另一个列表的子集吗?具体... 查看详情

如何检查列表中是不是有元组?

】如何检查列表中是不是有元组?【英文标题】:Howtocheckifthere\'satupleinsidealist?如何检查列表中是否有元组?【发布时间】:2018-10-2912:58:02【问题描述】:为什么会这样:seq=[(1,2),(3,4),(5,6)]print(()inseq)返回False?如何检查在没有特定... 查看详情

如何检查平面列表中是不是有重复项?

】如何检查平面列表中是不是有重复项?【英文标题】:HowdoIcheckifthereareduplicatesinaflatlist?如何检查平面列表中是否有重复项?【发布时间】:2010-12-0505:39:33【问题描述】:例如,给定列表[\'one\',\'two\',\'one\'],算法应该返回True,... 查看详情

如何确定一个列表是不是是另一个列表的子集?

】如何确定一个列表是不是是另一个列表的子集?【英文标题】:Howtodetermineifalistissubsetofanotherlist?如何确定一个列表是否是另一个列表的子集?【发布时间】:2009-08-2615:53:06【问题描述】:确定一个列表是否是另一个列表的子... 查看详情

如何创建检查数组是不是包含值的查询?戈朗戈姆

】如何创建检查数组是不是包含值的查询?戈朗戈姆【英文标题】:Howtocreatequerythatchecksifarraycontainsvalue?golanggorm如何创建检查数组是否包含值的查询?戈朗戈姆【发布时间】:2022-01-1609:59:21【问题描述】:这是模型的外观:typeBo... 查看详情

如何检查多值字段是不是包含值 MS Access

】如何检查多值字段是不是包含值MSAccess【英文标题】:HowtocheckifmultivaluedfieldcontainsvaluesMSAccess如何检查多值字段是否包含值MSAccess【发布时间】:2015-05-1815:12:05【问题描述】:我在MicrosoftAccess2007中遇到了多值字段问题。我想在... 查看详情

根据字段子集的列表中的唯一元素

...asubsetoffields【发布时间】:2021-08-0710:20:44【问题描述】:给定一个类似的记录dataFoo=FoofooName::Text,fooAge::Int,fooCity::Text有了这些元素的列表,在这个假设的removeDupBy函数的模型上,是否有一个函数可以仅删除字段子集上的重复项?f 查看详情

检查输入到文本字段的值是不是是给定范围内的整数

】检查输入到文本字段的值是不是是给定范围内的整数【英文标题】:Checkthatvalueinputtotextfieldisintegeringivenrange检查输入到文本字段的值是否是给定范围内的整数【发布时间】:2011-06-2416:09:12【问题描述】:我有一个可编辑的UIText... 查看详情

如何检查给定值是不是是私有路由中的 JWT?

】如何检查给定值是不是是私有路由中的JWT?【英文标题】:HowtocheckthatagivenvalueisaJWTinaprivateroute?如何检查给定值是否是私有路由中的JWT?【发布时间】:2020-07-1012:46:02【问题描述】:目前我有以下用于私有路由的React组件importRo... 查看详情

如何在Python 3中检查给定数字是不是是阶乘[关闭]

】如何在Python3中检查给定数字是不是是阶乘[关闭]【英文标题】:HowtocheckifagivennumberisafactorialornotinPython3[closed]如何在Python3中检查给定数字是否是阶乘[关闭]【发布时间】:2020-01-2821:33:37【问题描述】:例如24,是一个阶乘,因为... 查看详情

Nodejs - Joi 检查字符串是不是在给定列表中

】Nodejs-Joi检查字符串是不是在给定列表中【英文标题】:Nodejs-JoiCheckifstringisinagivenlistNodejs-Joi检查字符串是否在给定列表中【发布时间】:2017-05-1511:26:40【问题描述】:我使用Joipackage进行服务器端验证。我想检查给定字符串是... 查看详情

检索域的 GORM 持久属性列表

...domain【发布时间】:2011-06-0102:34:33【问题描述】:获取与给定GORM域对象关联的持久属性列表的最佳/最简单方法是什么?我可以获取所有属性的列表,但是这个列表包含非持久性字段,例如class和constraints。目前我正在使用它并使... 查看详情

检查dict中是不是存在给定项目的列表[重复]

】检查dict中是不是存在给定项目的列表[重复]【英文标题】:Checkiflistwithgivenitemsispresentindict[duplicate]检查dict中是否存在给定项目的列表[重复]【发布时间】:2017-02-0810:54:51【问题描述】:我有一个这样的字典和一个列表:hey=\'2\'... 查看详情

检查elasticsearch中是不是存在文档

】检查elasticsearch中是不是存在文档【英文标题】:Checkifdocumentexistsornotinelasticsearch检查elasticsearch中是否存在文档【发布时间】:2017-08-0110:34:54【问题描述】:我想检查具有特定字段值的文档在elasticsearch中是否存在。我已经上网... 查看详情

如何检查一个数组是不是是 JavaScript 中另一个数组的子集?

】如何检查一个数组是不是是JavaScript中另一个数组的子集?【英文标题】:HowtocheckifanarrayisasubsetofanotherarrayinJavaScript?如何检查一个数组是否是JavaScript中另一个数组的子集?【发布时间】:2016-12-1304:17:35【问题描述】:假设我有... 查看详情

java示例代码_HQL(Hibernate)如何检查一个元素列表是否是另一个列表的子集

java示例代码_HQL(Hibernate)如何检查一个元素列表是否是另一个列表的子集 查看详情