我有幾個場景,我想檢索一個單一的Advertiser
並渴望獲取大部分對象圖。我絕對不想在默認情況下這樣做,所以我一直在尋找正確的方法來爲單個查詢做到這一點。這是我到目前爲止:是否有更清晰,更Grailsy的方式來編寫此查詢?
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)
}
這工作,但我不喜歡它的原因有幾個。
- 這似乎是一個非常間接和不直觀的方式來說「只需加入dang表。
- 沒有編譯時檢查。如果
foos
關聯在Advertiser
上不存在,則編譯器不會在意。
以下是我真的很想看到它的工作:
Advertiser.where {
id == id
foos {
bars {
baz
}
}
}
但是,這並不做任何加盟;顯然,如果你實際上沒有指定該屬性的條件(>
,<
,==
等),它會忽略你。
我有什麼選擇?我怎樣才能讓這個更直觀的閱讀?尋找最接近我的理想,因爲我可以得到。
編輯
我嘗試下面的一些建議,事情不工作,也可能是部分原因是因爲我沒有收到我的語法正確。比方說,我需要急於獲取額外的1級協會呼籲whatsits
我試圖做這種方式:
Advertiser.withCriteria {
idEq(id)
whatsits
foos {
bars {
baz
}
}
}
我也試過
Advertiser.withCriteria {
idEq(id) && whatsits && foos {
bars {
baz
}
}
}
但不同方法會產生不同的例外情況,看起來很奇怪的查詢等等。
這個問題使用1個INNER_JOIN和2個LEFT_JOINs。 FetchMode.JOIN將導致3個INNER JOIN。 – 2017-05-06 06:30:27