3

我正在使用 Hibernate (GORM) 进行 Grails 项目。我有以下领域模型:

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

Person {
   static hasMany = [clientContacts: ClientContact]
}

当我尝试ClientContacts使用特定所有者 ( Person) 检索所有内容时,我遇到了一些有趣的问题。我正在使用以下查询条件:

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

问题是当我遍历ClientContacts结果中的每一个时,它们只有一个所有者- 事实上,大多数都有许多其他所有者。是什么赋予了?我知道 hibernate/GORM 使用延迟获取,但我认为ClientContact当我尝试访问它们时它会获取所有其他所有者。

有什么想法吗?我想继续使用list()函数,因为它提供了一些不错的分页功能。

4

3 回答 3

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

于 2012-01-27T15:14:34.250 回答
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
于 2008-11-01T00:05:15.347 回答
0

id 和 version 是所有 GORM 类的特殊属性。您不需要在类声明中指定它们,也不能对它们使用标准标准。

您肯定需要使用 eqID 标准

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
于 2008-11-22T22:48:19.357 回答