У меня есть вопрос HQL (в Groovy / Grails), с которым я надеялся, что кто-то может мне помочь.
У меня есть простой объект актива с коллекцией тегов «один ко многим».
class Asset {
Set tags
static hasMany = [tags:Tag]
}
class Tag {
String name
}
Что я пытаюсь сделать в HQL:
Пользователь передает некоторые теги в params.tags
(например: groovy grails пород) и хочет вернуть активы, которые имеют эти теги, и только эти точные теги.
Вот мой 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()
, чтобы я мог получить экземпляры тега и уникальные идентификаторы для каждого запрошенного тега.
Я также безуспешно пытался преобразовать переданные теги в список экземпляров Tag с Tag.findByName(t1)
для каждого тега, а также список (уникальных) идентификаторов тегов в HQL выше.
Буду признателен за любую помощь / совет.