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

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

Person {
   static hasMany = [clientContacts: ClientContact]
}

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

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

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

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

有帮助吗?

解决方案

我知道这个帖子已经很老了,但是我今天遇到了完全相同的问题而且解决方案似乎是使用了别名,所以相反:

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

其他提示

两个快速观察:

  1. [Grails文档]( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html。#5.2.1.3 多对多很多人说,多对多关联必须手动编码,默认的脚手架不会这样做。
  2. 您可能需要使用 eqId()标准 - 请参阅 createCriteria

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

您肯定需要使用eqID标准

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top