HQL加入Grails:Part Deux

时间:2012-06-20 05:50:14

标签: grails join groovy hql

这是我问here

的问题的扩展

我有这样的关系

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的所有Bar实例关联的Thing的所有实例,这些实例与我拥有的Thing实例相关联。

我想通过HQL获得什么(HQL是否知道FooThing1之间的间接关系?)

更新

以下是可能关系的图片。

enter image description here

如果我有Foo并希望通过BarFoo1间接关联的所有Foo2实例,那么我需要的解决方案将返回{{1}}和{{ 1}}

2 个答案:

答案 0 :(得分: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))
编辑:既然你用漂亮的图片解释了你想要的东西,那就更简单了。事实上你想要的是所有与至少一个栏(而不是所有的栏)相关联的Foo也链接到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)

答案 1 :(得分:0)

这样的事情会起作用吗?

Foo.withCriteria {
    bars {
        in('id', thing.bars.collect { it.id })
    }
}