2010-05-03 86 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