2008-10-31 140 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