Hibernate标准 - 获取单个对象
题
我正在使用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
其他提示
两个快速观察:
- [Grails文档]( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html。#5.2.1.3 多对多很多人说,多对多关联必须手动编码,默认的脚手架不会这样做。
- 您可能需要使用
eqId()
标准 - 请参阅 createCriteria
醇>
id和version是所有GORM类的特殊属性。您不需要在类声明中指定它们,也不能将标准条件与它们一起使用。
您肯定需要使用eqID标准
def query = {
owners {
eqId(Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)
不隶属于 StackOverflow