2008-10-31 88 views
3

我正在使用Hibernate(GORM)開發Grails項目。我有以下域模型休眠標準問題

ClientContact{ 
    static hasMany = [owners: Person] 
    static belongsTo = [Person] 
} 

Person{ 
    static hasMany = [clientContacts:ClientContact] 
} 

當我嘗試檢索與特定所有者(人)的所有ClientContacts時,我遇到一些有趣的問題。我使用下面的查詢條件:

def query = { 
     owners { 
      eq("id", Long.parseLong(params.ownerId)) 
     } 
    } 
    def criteria = ClientContact.createCriteria() 
    def results = criteria.list(params, query) 

的問題是....當我我的每在結果ClientContacts的迭代,他們只有的一個業主 - 當其實,最有許多其他業主。是什麼賦予了?我知道hibernate/GORM使用懶惰抓取,但我認爲它會在我試圖訪問ClientContact時抓取所有其他所有者。

有什麼想法?我想繼續使用列表()函數,因爲它提供了一些很好的分頁功能。

安德魯

回答

3

我知道這個線程是很老了,但我遇到了正好今天同樣的問題和解決方案似乎是別名的使用,所以改爲:

def query = { 
     owners { 
       eq("id", Long.parseLong(params.ownerId)) 
     } 
} 

一個可以嘗試:

def query = { 
     createAlias("owners", "o") 
     eq("o.id", Long.parseLong(params.ownerId)) 
} 

第一個查詢創建左外連接,第二個創建內連接。請參閱以下鏈接以獲取更多詳細信息:http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html

0

兩個快速意見:

  1. 的[Grails的文檔(http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.1.3許多一對多)說,一個許多一對多協會必須手動編碼,則默認的腳手架不會這樣做。
  2. 您可能需要使用eqId()標準 - 見createCriteria
+0

我已經添加了所有適當的方法來支持多對多關聯。我知道這是因爲我可以向所有者添加ClientContacts。問題在於檢索 - 如上所述。 我嘗試了eqId()搜索條件,但它最終返回了與ClientContacts完全相反的結果。我迷路了。 – anschoewe 2008-11-02 03:39:37

0

標識和版本都GORM類的特殊屬性。您不需要在類聲明中指定它們,也不能在它們中使用標準條件。

你一定要使用eqID標準

def query = { 
      owners { 
       eqId(Long.parseLong(params.ownerId)) 
      } 
    } 
    def criteria = ClientContact.createCriteria() 
    def results = criteria.list(params, query) 
+0

不幸的是,當我使用上面的代碼時...我得到一個錯誤:「沒有方法簽名:grails.orm.HibernateCriteriaBuilder.eqId()適用於參數類型:(java.lang.Long)values:{123} 」。 當我使用idEq,如下所示:http://grails.org/Hibernate+Criteria+Builder,我得到一個空的列表。 – anschoewe 2008-12-16 23:23:46