1

这是我在这里提出的问题的扩展

我有这样的关系

class Foo {
    static hasMany = [bars: Bar]
}

class Bar {
    // Has nothing to tie it back to Foo or Thing
}

class Thing {
    static hasMany = [bars: Bar]
}

我有一个Thing. 我想获取与我拥有的实例相关Foo联的所有实例相关联的所有实例。BarThing

我想通过 HQL 实现什么(HQL 是否知道Thingand之间的间接关系Foo)?

更新:

这是可能的关系的图片。

在此处输入图像描述

如果我有Thing1并且我希望所有实例Foo都通过它间接关联,Bar那么我需要的解决方案将返回Foo1并且Foo2

4

2 回答 2

3

像这样的东西应该工作:

select foo from Foo foo
where not exists (select thingBar.id from Thing thing left join thing.bars thingBar
                  where thing.id = :thingId
                  and thingBar.id not in (select fooBar.id from Foo foo2
                                          left join foo2.bars fooBar
                                          where foo2.id = foo.id))

编辑:既然你已经用一张漂亮的照片解释了你想要的东西,那就更简单了。实际上,您想要的是所有链接到至少一个栏(而不是所有栏)的所有 Foos 也链接到 Thing。因此,查询将是:

select foo from Foo foo
inner join foo.bars fooBar
where fooBar.id in (select thingBar.id from Thing thing inner join thing.bars thingBar)
于 2012-06-20T06:01:13.943 回答
0

像这样的工作吗?

Foo.withCriteria {
    bars {
        in('id', thing.bars.collect { it.id })
    }
}
于 2012-06-20T12:43:09.630 回答