0

我在以下示例类之间有一对多的关系:

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 层楼的房屋发放贷款的活动银行对象。在名为Queries 的银行中,我尝试过:

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

我如何将银行返还给那些在两层楼上拥有贷款的银行?

4

2 回答 2

2

好吧,经过多次尝试,我永远无法使用具有多个关联级别的直接关联 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()

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

希望这至少能让你继续......

于 2012-12-12T02:07:03.870 回答
0

嗨,凯利

这么长时间后,为了让您最终得到澄清,我假设我们在非主键列上使用了“gt,eq”之类的限制,例如贷款 - > yearIssued,home - > numStories。

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

我们在哪里不需要别名:

  1. 不适用任何限制
  2. 仅适用于关联实体主键列的限制。

希望这可以澄清事情并可能对某人有所帮助。

于 2016-12-14T18:30:29.523 回答