最近我从Grails 1.3.9升级到2.2.4并注意到fetch有一些不一致的行为:" join"映射。我创建了一个简单的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]
}
在2.2.4中的Grails控制台中运行以下脚本:
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]
使用和不使用fetch在1.3.9上运行相同的脚本:" join"每次都给出以下输出:
[findbytest.Variable : 1, findbytest.Variable : 2]
[findbytest.Variable : 1, findbytest.Variable : 2]
[findbytest.Variable : 1, findbytest.Variable : 2]
感谢任何帮助或指示。 谢谢!
答案 0 :(得分:1)
您的问题可能与此错误有关:https://jira.grails.org/browse/GRAILS-9829
这实际上意味着使用任何基于Criteria的查询,您都不能使用fetch-joins。
您需要使用直接HQL进行此类优化查询。
如果你的问题追溯到上面的错误,请评论错误报告,也许它的重要性增长到足以保证行动(我认为这是一个足够大的问题甚至可以触发某人的修补版本的Hibernate3)。