2014-09-30 60 views
2

最近我從Grails 1.3.9升級到2.2.4,並注意到一些不連貫的行爲:「連接」映射。我創建了一個簡單的grails項目來演示問題。Grails抓取:「加入」混淆

報告域:

class Report { 

    String name 

    static hasMany = [variables:Variable] 

    static mapping = { 
     variables cascade: "all-delete-orphan", fetch: "join" 
    } 
} 

可變域:

class Variable { 

    String name 

    static belongsTo = [parent:Report] 
} 

運行Grails的控制檯下面的腳本在2.2.4:

if(!Report.findByName("Test")){ 
Report report = new Report(name:"Test") 
Variable var1 = new Variable(name:"var") 
Variable var2 = new Variable(name:"var2") 
report.addToVariables(var1) 
report.addToVariables(var2) 
report.save(flush:true) 
} 

def report2 = Report.findByName("Test") 
println report2.variables 

def report3 = Report.findAllByName("Test") 
println report3.get(0).variables 

def report4 = Report.findByName("Test",[fetch:[variables:"eager"]]) 
println report4.variables 

提供了以下的輸出:

關於腳本的首次運行:

[findbytest.Variable : 1, findbytest.Variable : 2] 
[findbytest.Variable : 1, findbytest.Variable : 2] 
[findbytest.Variable : 1, findbytest.Variable : 2] 

在第二和所有後續腳本的運行:

[findbytest.Variable : 1] 
[findbytest.Variable : 1] 
[findbytest.Variable : 1] 

取出取:「加入」並重新運行腳本每次給出了下面的輸出時間:

[findbytest.Variable : 1, findbytest.Variable : 2] 
[findbytest.Variable : 1, findbytest.Variable : 2] 
[findbytest.Variable : 1, findbytest.Variable : 2] 

運行相同的腳本在1.3.9與不取指:「加入」給出了下面的輸出每次:

[findbytest.Variable : 1, findbytest.Variable : 2] 
[findbytest.Variable : 1, findbytest.Variable : 2] 
[findbytest.Variable : 1, findbytest.Variable : 2] 

任何幫助或方向表示讚賞。 謝謝!

+0

提供的答案可能是原因,但您在這裏不使用標準,這是唯一的區別,也是爲什麼它在1.3.9和2.2.4之間變化,它們不應該都有錯誤嗎?可能值得檢查生成的sql是什麼(logSql)。同樣在2.4.2中做同樣的項目,看看問題是否得到解決 – 2014-10-09 10:31:43

回答

1

您的問題可能有這個bug做:https://jira.grails.org/browse/GRAILS-9829

這實際上意味着,與任何一種標準的基於查詢,不能使用提取聯接。

您將需要使用直接HQL進行此類優化查詢。

如果你的問題追溯到上述錯誤,請評論錯誤報告,也許它的重要性增長到足以保證行動(我認爲這是一個足夠大的問題,甚至可以觸發某人修補的Hibernate3版本) 。