【问题标题】:grails hasMany left joingrails hasMany left join
【发布时间】:2015-02-16 15:59:13
【问题描述】:

hasMany 和左连接的问题:

类 A { 静态 hasMany = [b:B] } B类{字符串键,字符串值} 该关联创建了一个映射表 AB。

我想要做的是按 B 中 key = 'someKey' 的值对所有 A 对象进行排序。如果我使用 HQL 内连接

from A a inner join a.b b on b.key = 'someKey' order by b.value

我得到了具有 b.value = 'someKey' 的 A 子集。伟大的。所以,我认为我所要做的就是将内连接更改为左连接并获取 A 的完整列表,其中一些使用 b.value = 'someKey',其余的使用 b.value = null:

from A a left join a.b b on b.key = 'someKey' order by b.value

但是,当我使用左连接时,SQL 会显示 A->AB 之间的左连接,以及 AB->B 之间的另一个左连接。这不是我想要的,我真正想要的是维护 AB->B 的内部连接,使用 SQL 如下:

from A a left join AB ab
    inner join B b on ab.b_id = b.id and b.value = 'someKey'
on a.id = ab.a_id

我该怎么做?我觉得我遗漏了一些非常明显的东西。

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    这是我直接在mysql下做同样的事情,但你应该能够根据你的需要找出相同的东西..

    mysql> select a.applications_testserver_id,b.name from applications_test_app_servers a LEFT JOIN applications b ON a.applications_testserver_id=b.id where b.name IS NULL;
    +----------------------------+------+
    | applications_testserver_id | name |
    +----------------------------+------+
    |                        145 | NULL |
    +----------------------------+------+
    1 row in set (0.00 sec)
    
    mysql> delete applications_test_app_servers from applications_test_app_servers LEFT JOIN applications ON applications_test_app_servers.applications_testserver_id=applications.id where applications.name IS NULL;
    Query OK, 1 row affected (0.02 sec)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 2010-09-29
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多