Hibernate GORM中一对多属性的属性的条件查询

Hibernate GORM中一对多属性的属性的条件查询,hibernate,grails,gorm,Hibernate,Grails,Gorm,以下示例类之间存在一对多关系: Class Home { static hasMany = [loans: Loan] int numStories } Class Loan { static belongsTo = [Bank] Home home int yearIssued } Class Bank { SortedSet loans static hasMany = [loans: Loan] boo

以下示例类之间存在一对多关系:

Class Home {
    static hasMany = [loans: Loan]

    int numStories
}

Class Loan {
    static belongsTo = [Bank]

    Home  home
    int   yearIssued 
}

Class Bank {
    SortedSet loans
    static  hasMany   = [loans: Loan]

    boolean active
}
我正在尝试编写一个命名查询,以获取2007年在两层楼的房屋上发放贷款的所有活动银行对象。在银行名称查询中,我尝试了:

static namedQueries = { 
    myNamedQuery { yearIssued, numStories ->

        eq 'active', true
        loans {
            gt 'yearIssued', yearIssued

            home {
                eq 'numStories', numStories
            }
        }
    }
}
如果我删除上面的“home{eq…}”部分,查询工作正常,只是不限于2层。当按上述方式执行时,我得到一个groovy.lang.MissingMethodException错误,如:

   No signature of method: package.stuff.Home.call() is applicable for argument types
(package.stuff.Bank$__clinit__closure3_closure10_closure20_closure21) 
values: [package.stuff.Bank$__clinit__closure3_closure10_closure20_closure21@746231ed];

    Possible solutions: wait(), last(), save(), any(), getAll(), wait(long)" 

我该如何将银行限制在那些拥有两层楼住房贷款的银行?

好吧,经过多次尝试,我始终无法使用具有多个关联级别的直接关联dsl使其工作。我能够使用别名使其工作:

 static namedQueries = { 
   myNamedQuery { yearIssued, numStories ->
     eq 'active', true
     createAlias 'loans','l'
     createAlias 'l.home','h'
     gt('l.yearIssued', yearIssued)
     eq('h.numStories',numStories)
  }
}
然后使用

def bankInstanceList = Bank.myNamedQuery(2007,2).list()
我现在还不确定这是为什么——可能是一个bug,也可能只是我不理解的设计行为

希望这至少能让你继续…

经过这么长时间,终于让你得到澄清, 我假设我们在非主键列上使用了诸如“gt,eq”之类的限制,如贷款->年发行,房屋->国民储蓄

只有在这种情况下,才能导航到贷款、房屋等关联路径;我们需要创建别名

哪里不需要别名:

  • 没有适用的限制
  • 仅对关联实体主键列应用限制

  • 希望这能澄清这件事,并能帮助别人。

    谢谢!我在单元测试中运行了所有这些,显然在我的测试设置中,createAlias失败了。我在“真实”设置中测试了您的解决方案,它确实有效。有趣的是,使用直接关联的原始方法在“真实”环境中也能正常工作,没有错误。再次感谢。