Grails fetch:“加入”混乱

时间:2014-09-30 04:24:36

标签: hibernate grails join

最近我从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]

感谢任何帮助或指示。 谢谢!

1 个答案:

答案 0 :(得分:1)

您的问题可能与此错误有关:https://jira.grails.org/browse/GRAILS-9829

这实际上意味着使用任何基于Criteria的查询,您都不能使用fetch-joins。

您需要使用直接HQL进行此类优化查询。

如果你的问题追溯到上面的错误,请评论错误报告,也许它的重要性增长到足以保证行动(我认为这是一个足够大的问题甚至可以触发某人的修补版本的Hibernate3)。