Hibernate HQL и Grails - Как сравнить коллекции? - PullRequest
3 голосов
/ 03 мая 2010

У меня есть вопрос 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 выше.

Буду признателен за любую помощь / совет.

1 Ответ

1 голос
/ 04 мая 2010

Требуется слишком много мозговых усилий, чтобы разобраться с этим. Вы рассматривали возможность использования плагина Searchable вместо этого? Вы можете настроить Tag как «компонент» Актива, а затем выполнить поиск, например «+ tag: groovy + tag: grails + tag: rocks». Это даст вам результаты, к которым вы стремитесь (и, вероятно, быстрее).

...