使用父属性的多个父对象和子对象的GORM查询

时间:2013-07-02 15:18:57

标签: grails gorm parent-child subset

仅供参考,请随意为此提出更好的标题。我有以下域模型(我们无法控制):

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的所有Bars,但只在一个查询中而不是每个Foo的查询,不涉及延迟加载。还可以选择将条形设置为预先获取的选项。

例如,如果这是我的数据(伪代码,为简单起见,我将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查询。

2 个答案:

答案 0 :(得分:1)

试试这个:

Bar.executeQuery("select b from Bar b join b.foo as f where b.someDate = f.someDate and f in :fooList", [fooList: fooList])

答案 1 :(得分:-1)

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

:)

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

虽然我已经删除了你的复合映射约束然后尝试了它,但是为我工作了:)

或使用查询:

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

        }
println(km.list())

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

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

:)