标准查询GORM中一对多属性的属性

时间:2012-12-11 23:36:14

标签: 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]

    boolean active
}

我正在尝试编写一个命名查询,该查询获取2007年在2层故事中发布的贷款的所有活动Bank对象。在银行namedQueries我试过:

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)" 

我如何限制银行返回那些有2层房屋贷款的银行?

2 个答案:

答案 0 :(得分:1)

好吧,经过多次尝试后,我无法使用直接关联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()

我现在不确定这是为什么 - 可能是一个错误或只是我不理解的设计行为。

希望这至少可以帮助你......

答案 1 :(得分:0)

Kelly

经过这么长时间的努力,终于得到了澄清, 我假设我们在非主键列上使用像“gt,eq”这样的限制,例如贷款 - > yearIssued,home - > numStories。

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

我们在哪里不需要别名:

  1. 无限制适用
  2. 限制仅适用于关联的实体主键列。
  3. 希望这能澄清事情,并可能帮助某人。