仅供参考,请随意为此提出更好的标题。我有以下域模型(我们无法控制):
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查询。
答案 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}
:)