我正在使用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()函数,因为它提供了一些很好的分页功能。
答案 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)
两个快速观察:
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)