【问题标题】:HQL Left join with condition refering to third entityHQL 左连接,条件引用第三实体
【发布时间】:2014-09-05 02:20:02
【问题描述】:

我有三个实体/表

A 和 B 是一对多的关系,B 和 C 是一对一的关系。

我想获取所有具有特定 C 值的 A 并与 B 左连接

例如

我想要 A 和 B 的 C.value = 'A'

表 A

  id

   1

   2

   3

表 B

idToA ║ idToC ║ value

    1 ║     1 ║   'X'

    2 ║     1 ║   'Y'

    3 ║     2 ║   'Z'

表 C

  id ║  value

   1 ║    'A'

   2 ║    'B'

   3 ║    'C'

得到结果

A.id ║ b.value

   1 ║     'X'

   2 ║     'Y'

   3 ║     

我设法得到以下 SQL:

select a.id, b.value 
from A left outer join B on A.id = B.idToA and B.idToC in 
  (select id from C where C.value = 'A')

但由于左连接条件内的子查询,我似乎找不到将此查询转换为 HQL 的方法。

【问题讨论】:

    标签: left-join hql


    【解决方案1】:

    阅读JPA2.0规范后,左连接定义为:

    LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable
    [join_condition]
    

    这意味着您可以将您的 SQL 转换为 JPQL(我希望您的 Hibernate 至少为 4.3):

    select a.id, b.value 
    from A a
    left join a.idToA b on b.idToC in  (select id from C where C.value = 'A') // or property pointing to C
    

    如果您遇到此错误:with-clause 引用了两个不同的 from-clause 元素,请阅读此question

    【讨论】:

    • 该查询的问题是它不会返回没有与值为“A”的 C 关联的 B 的 A。正如我的问题的最后一部分所见,我想要所有的 A,不管左连接。
    • 我编辑了我的答案,这几乎是将您的 SQL 查询翻译成 JPQL。右边的on,带有子查询,可以在where部分移动。
    • 'on' 和 'where' 条件做不同的事情。 'on' 条件限制允许加入哪些 B,而 'where' 条件将限制结果中将出现哪些行。如果将条件放在where中,则问题中示例结果的最后一行将不会出现。
    • 我认为我的最后一次更新将结束您的问题。我在休眠 4.3.1.Final 上试过了。
    【解决方案2】:

    问这个问题的方式不利于清晰地思考 JPA 或 Hibernate。该语言不应该与诸如 a.idToB 之类的外键有关。相反,您的参考文献应该更像

    class A {
       @OneToMany()
       private List<B> bList;
    
       ... etc
    }
    
    class B {
        @ManyToOne()
        private A a;
    
        @OneToMany()
        private List<C> cList;
    
        ... etc ... 
    }
    

    您的查询中未指定键。它们由您的类映射,以便连接可以由您的 JPA 实现管理。那么您的示例查询可能看起来更像这样

    "select a.id, b.value from A a 
        left join a.bList b
        left join b.cList c
        where c.value = :valueParam
        or b is null"
    

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      相关资源
      最近更新 更多