Hibernate标准 - 获取单个对象

时间:2008-10-31 22:51:38

标签: hibernate grails groovy gorm

我正在使用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()函数,因为它提供了一些很好的分页功能。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

您肯定需要使用eqID标准

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