2010-03-16 47 views
4

我對標準構建器有一個令人沮喪的問題。我有一個應用程序,其中一個用戶有一個日曆,而日曆有很多條目。看起來很簡單,但是當我嘗試獲取給定用戶的日曆條目時,我無法訪問用戶屬性(MissingMethodException)。下面的代碼:Grails:標準構建器中存在嵌套關聯的問題

def getEntries(User user) { 
    def entries = [ClassName].createCriteria().list() { 
    calendar { 
     user { 
     eq("id", user.id) 
     } 
    } 
    } 
} 

我已經甚至嘗試以下變化:

def getEntries(User user) { 
    def entries = [ClassName].createCriteria().list() { 
    calendar { 
     eq("user", user) 
    } 
    } 
} 

這並沒有引發異常,但也不能工作。

這裏是域類的相關部分:

class Calendar { 
    static belongsTo = [user: User] 
    static hasMany = [entries: Entries] 

    ... 
} 

class User { 
    Calendar calendar 

    ... 
} 

class Entry { 
    static belongsTo = [calendar: Calendar] 

    ... 
} 

當谷歌搜索我遇到了類似的問題就來了早在2008年指出: http://jira.codehaus.org/browse/GRAILS-1412

但根據該鏈接這個問題應該已經解決很久以前。

我在做什麼錯?

+0

您可以打開org.hibernate.SQL調試登錄電子,看看查詢它的運行?這可能有助於追蹤發生了什麼問題。 – leebutts

+0

我試過,我得到的是: Q1:選擇this_.id作爲id8_0_,this_.version作爲版本8_0_,... 從用戶this_ where this_.username =? Q2:選擇top? (*)作爲y0_來自條目this_左 外部連接日曆calendar_a1_ on_calendar_id = calendar_a1_.id 其中((calendar_a1_.id =?)) Q3:select top? this_.id爲id3_1_,this_.version爲version3_1_,... 從入門THIS_左外連接日曆calendar_a1_上this_.calendar_id = calendar_a1_.id 其中((calendar_a1_.id =?)) 這似乎沒什麼問題。有任何想法嗎? (抱歉格式化,評論似乎沒有很好地對待代碼。) –

+0

我沒有看到'where calender.user_id =?'的任何內容。雖然... – leebutts

回答

9

我終於找到了錯誤!該錯誤與標準生成器沒有任何關係。在這種情況下,問題是,我有用戶變量範圍,所以當我試圖通過

calendar { 
    user { 
    eq("id", user.id) 
    } 
} 

進入用戶關係的Grails以爲我想叫一個閉合用戶對象/變量。我可以再次自由地使用標準建造者:-)

感謝您的幫助和建議傢伙!

+1

互聯網的喜悅。6年後,這個問題節省了我很多調試時間。 – user2782001

1

我不確定爲什麼您的標準不起作用。我總是遇到一些問題,讓他們的工作非常正確,並且比HQL更加費力。

您可以使用HQL進行查詢,因爲我習慣將查找視爲SQL,所以我發現這些查詢更自然,也更易於解析。

這是你查詢的HQL:

Entry.executeQuery("from Entry e where e.calendar.user.id = :userId", [userId: theUser.id]) 
+0

感謝泰德,我更喜歡有標準,因爲我認爲他們更具可讀性,更容易重構。但同時我會使用HQL,但它讓我感到困惑,那就是標準生成器無法正常工作。 –

0

這裏是一個東西

def getEntries(User user) { 
def entries = Entries.createCriteria().list() { 
      calendar { 
      user { 
       eq("id", user.id) 
      } 
      } 
     } 
} 
+0

對不起,我更早拼錯,它當然應該是 eq(「id」,user.id) 但這並沒有工作,我仍然得到相同的錯誤... –

0
def entries = Entries.createCriteria().list() { 

你爲什麼寫?你的類名是條目。 所以我會說你的線應該是這樣的:

def entries = Entry.createCriteria().list() { 
+0

你是對的,從我的另一個拼寫錯誤部分。 Howerver,這仍然不能解決我的問題:-( –

3

如果你有這樣的範圍錯誤,如問題的海報,你總是可以做到以下幾點。比方說你有一個用戶變量在你的範圍,然後使用

def user = User.get(...) 
... 
calendar { 
    'user' { 
    eq("id", user.id) 
    } 
} 

代替

def user = User.get(...) 
... 
calendar { 
    user { 
    eq("id", user.id) 
    } 
}