【问题标题】:How to get the Join of Two One to Many associations?如何获得两个一对多关联的加入?
【发布时间】:2010-10-12 17:55:21
【问题描述】:

我有两个休眠实体用户和博客。用户可以对多个标签感兴趣。博客可以属于多个标签。对于用户,我如何找到属于用户感兴趣的标签的博客?

我需要类似的东西

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

除了 SQL 或 HQL 不允许在 IN 子句中进行此类比较

我目前使用的解决方案是:

  1. 生成一个 VIEW USER_BLOGS,它是 连接表 USER_TAGS 和 BLOG_TAGS。
  2. 为视图定义一个实体 UserBlog 并使用它来过滤博客 HQL 查询:

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

我确定这是一种常见的情况。有没有纯 Hibernate 或 HQL 解决方案?

【问题讨论】:

  • 博客和标签与用户和标签之间的关系是如何存储的?
  • 在两个连接表 BLOG_TAGS 和 USER_TAGS 中,TAGS 在一个单独的表上。

标签: java sql hibernate activerecord join


【解决方案1】:

你在寻找这样的东西吗?

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

【讨论】:

【解决方案2】:

afair HQL 有 IN 例如。元素中的 somecat (cat.kittens)

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

本章纯粹是关于查询的,其中很大一部分是关于处理集合和连接的。 gf

【讨论】:

    【解决方案3】:

    对于 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)
    

    如果您在此或更好的解决方案中发现任何问题,请发布您的答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2016-04-23
      • 2015-06-01
      • 2014-12-27
      • 2015-08-02
      • 2020-11-24
      • 1970-01-01
      相关资源
      最近更新 更多