0

仅供参考,请随时为此建议一个更好的标题。我有以下域模型(我们无法控制):

class Foo {
    int id
    String baz
    Date someDate
    static hasMany = [bars:Bar]
    static mapping = {
        id composite: [ "id", "baz" ]
    }
}

class Bar {
    int id
    String baz
    Date someDate
    Foo foo
    static mapping = {
        id composite: ["id", "baz", "someDate"]
        columns {
            foo([:]) {
                column name: "id"
                column name: "baz"
            }
        }
    }
}

我的问题是:我有一个 Foo 列表,我需要找到 Foo.someDate == Bar.someDate 的所有 Bar,但仅在一个查询中而不是对每个 Foo 的查询中,不涉及延迟加载。此外,将 Bars 设置为渴望获取也不是一种选择。

例如,如果这是我的数据(伪代码,为简单起见,我将 id 和 baz 组合成简单的“id”):

[
    Foo (someDate:4/1/2013)
        |___ bars: [{someDate:12/4/2012, id:1}, {someDate:4/1/2013, id:2}]
    Foo (someDate:5/10/2012)
        |___ bars: [{someDate:{4/1/2013, id:3}
    Foo (someDate:3/3/2013)
        |___ bars: [{someDate:3/3/2013, id:4}, {someDate:9/5/2013, id:5}]
]

我需要在一个查询中返回 id 为 2 和 4 的 Bars。我真的不知道如何解决这个问题。

如有必要,它可以是 HQL,但最好是 GORM 查询。

4

2 回答 2

1

尝试这个:

Bar.executeQuery("select b from Bar b join b.foo as f where b.someDate = f.someDate and f in :fooList", [fooList: fooList])
于 2013-07-02T18:48:46.677 回答
-1

不确定这是否是最好的方法,但我认为它会给你结果

:)

Bar.executeQuery("select b.id from Bar b, Foo f where b.someDate = f.someDate")

虽然我已经删除了您的复合映射约束然后尝试了它,但对我有用:)

或使用 where 查询:

def km = Bar.where {
            foo.someDate==someDate

        }
println(km.list())

如果您已经有 foo 列表,则可以通过 findAll 闭包进行过滤:

fooList.findAll{it.someDate in it.bars.someDate} 

:)

于 2013-07-02T15:53:51.357 回答