我有几个场景,我想检索单个Advertiser
并急切地获取它的大部分对象图。默认情况下我绝对不想这样做,所以我一直在寻找正确的方法来为单个查询执行此操作。到目前为止,这是我想出的:
Advertiser.createCriteria().get {
eq('id', id)
createAlias('foos', 'foos', CriteriaSpecification.LEFT_JOIN)
createAlias('foos.bars', 'bars', CriteriaSpecification.LEFT_JOIN)
createAlias('bars.baz', 'bazzes', CriteriaSpecification.INNER_JOIN)
}
这行得通,但我不喜欢它有几个原因。
- 这似乎是一种非常间接且不直观的方式来表达“请加入该表”。
- 没有编译时检查。如果
foos
关联在 上不存在Advertiser
,编译器不会在意。
这是我真的很想看到它工作的方式:
Advertiser.where {
id == id
foos {
bars {
baz
}
}
}
但这并没有做任何加入;显然,如果您实际上没有为该属性(>
, <
,==
等)指定条件,它只会忽略您。
我有哪些选择?至少,我怎样才能使它更直观地阅读?尽我所能寻找最接近我的理想。
编辑
我尝试了下面的一些建议,但没有奏效,这可能部分是因为我的语法不正确。假设我需要急切地获取一个名为whatsits
我正在尝试这样做:
Advertiser.withCriteria {
idEq(id)
whatsits
foos {
bars {
baz
}
}
}
我也试过
Advertiser.withCriteria {
idEq(id) && whatsits && foos {
bars {
baz
}
}
}
但是不同的方法会产生不同的异常、奇怪的查询等。