Как получить объединение двух один ко многим? - PullRequest
1 голос
/ 11 марта 2009

У меня есть две спящие сущности: Пользователь и Блог. Пользователь может быть заинтересован в нескольких тегах. Блог может принадлежать нескольким тегам. Для пользователя, как мне найти блоги, принадлежащие тегам, которые интересуют пользователя?

Мне нужно что-то вроде

Select * from Blog where Blog.Tags IN User.Tags

за исключением того, что SQL или HQL не разрешают такие сравнения в предложении IN

Решение, которое я использую в настоящее время:

  1. Создание VIEW USER_BLOGS, который является декартовым произведением объединить таблицы USER_TAGS и BLOG_TAGS.
  2. Определите Entity UserBlog для просмотра и используйте его для фильтрации блогов в HQL-запрос:

    Select * 
    from Blog 
    where Blog.id 
    IN (Select blog_id from UserBlog where user_id = "CurrentUser")
    

Я уверен, что это распространенный сценарий. Для этого есть чистый Hibernate или HQL-решение?

Ответы [ 3 ]

1 голос
/ 11 марта 2009

Вы ищете что-то подобное?

select b.* 
  from blog b 
  join blog_tags bt on bt.blog_id = b.id
  join user_tags ut on ut.tag = bt.tag
  where ut.user_id = (this_user)

Вопреки комментарию, я считаю, что HQL разрешает явные объединения (я могу ошибаться, но вижу http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html). В любом случае это можно сделать без явных объединений:

select b.* 
  from blog b, blog_tags bt, user_tags ut 
  where ut.user_id = (this_user) 
    and bt.blog_id = b.id 
    and ut.tag     = bt.tag
0 голосов
/ 14 марта 2009

Для решения MarkusQ мне пришлось объявить сущности для таблиц объединения, таких как UserTag и BlogTag, для использования в HQL-запросах.

Мое предыдущее решение по созданию представления USER_BLOGS было слишком медленным.

Это запрос HQL, который работал без каких-либо дополнительных сущностей:

select b.* from Blog blog, User user, Tag tag
where tag in elements (user.tags)
and tag in elements (blog.tags)
and user.id = (current_user)

Если вы обнаружите какие-либо проблемы в этом или лучших решениях, пожалуйста, оставьте свои ответы

0 голосов
/ 11 марта 2009

В HQL есть IN, например. somecat in elements (cat.kittens)

http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html

Эта глава посвящена исключительно запросам, большая часть посвящена обработке коллекций и объединений. гл хф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...