2012-12-11 39 views
0

一個一到多的財產屬性查詢我有以下的例子類之間的一個一對多的關係:標準在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年在兩個故事家園中發行的貸款的所有活躍銀行對象。在銀行namedQueries我想:

static namedQueries = { 
    myNamedQuery { yearIssued, numStories -> 

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

      home { 
       eq 'numStories', numStories 
      } 
     } 
    } 
} 

如果我刪除了「家{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: [pack[email protected]746231ed]; 

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

我怎麼會限制銀行還給那些對與2層房屋貸款?

回答

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

我不知道此刻這是爲什麼叫它 - 可能是一個錯誤或者只是設計的行爲我不明白。

希望這至少可以讓你去...

+0

謝謝!我在單元測試中運行所有這些,顯然在我的測試設置中,createAlias失敗。我以「真實」的設置測試了您的解決方案,確實有效。有趣的部分是,使用直接關聯的原始方式也在「真實」環境中工作而沒有錯誤。再次感謝。 –

0

Kelly

終於得到你的澄清,所以很長一段時間後,我 假設我們使用的是像限制「GT,EQ」上非主鍵列如貸款 - > yearIssued,home - > numStories。

只有在這種情況下,才能導航到貸款,家庭等關聯路徑;我們需要創建別名。

我們在哪裏不需要別名:

  1. 僅應用於對相關實體主鍵列應用​​
  2. 限制沒有限制。

希望這可以澄清事情並可以幫助某人。