2010-05-03 57 views
3

我有一个HQL问题(在Groovy/Grails中)我希望有人能帮助我。Hibernate HQL和Grails-如何比较集合?

我有一个一对多的标签集合上进行简单的资产对象。

class Asset { Set tags static hasMany = [tags:Tag] }

class Tag { String name }

我试图在HQL做:

用户通过在一些标签params.tags(例如:常规Grails的岩石),并希望返回资产(S )有这些标签,只有那些确切的标签。

这里是我的HQL如果一个或多个标签的存在,返回资产在资产标签:

SELECT DISTINCT a FROM Asset a LEFT JOIN a.tags t WHERE t.name IN (:tags)

assetList = Asset.executeQuery(hql, [tags:tokenizedTagListFromParams]

上面的代码运行完美,但它真的像一个OR 。如果找到任何标签,它将返回该资产。

我只想要回那有那些完全相同的标签(在数量上也一样)的资产。

每次创建新标签时,我new Tag(name:xxx).save()这样我就可以获取该被要求为每个标签的标签实例和唯一的ID。

我也试着将传入的标签转换为标签实例列表,每个标签都有Tag.findByName(t1),还有一个(唯一的)标签ID列表,上面的HQL没有运气。

我将不胜感激任何帮助/建议。

+0

有趣的这实际上解决了我的问题,因为原来的错误实际上是我想要产生的行为。 – nhouser9 2017-05-08 21:32:30

回答

1

它占用太多的脑努力工作,这一个。你有没有考虑过使用Searchable插件?您可以将Tag设置为Asset的“组件”,然后执行“+ tag:groovy + tag:grails + tag:rocks”等搜索。这会让你获得结果(可能更快)。

+0

嗨,彼得! 这是一个很好的建议。恰巧我的项目正在使用可搜索插件! “标签”是Asset类中定义的可搜索“组件”。 我有一个搜索框的页面,我试图寻找这些标签:groovy grails岩石,我得到资产命中。优秀。 但是,当我尝试你提到的语法,我根本没有得到任何命中! 是否有我需要的特殊报价或配置? 我检查了查询解析器语法;它应该工作。 我只是想知道为什么我根本没有任何结果。 谢谢你的出色建议! Burt Prior – BurtP 2010-05-05 01:18:23

+0

如果您的可搜索类具有“标签”属性,则可以使用'tag:...'语法。也许一个'tags:...'前缀会起作用? 我知道你可以将标签名称作为类似'tag'的字段名称进行索引,但我不记得如何在Searchable中对其进行配置。您可以尝试: static searchable = { 标签[name:“tag”] } in'Asset'。 – 2010-05-24 11:26:36