我正在尝试构建我称为组的类的层次结构。域相当简单:
class SubGroup implements Serializable {
Group child
Group parent
static mapping = {
id composite: ['child', 'parent']
}
}
class Group implements Serializable {
int groupId
String key
String title
static mapping = {
id name: 'groupId'
}
}
基本上我想建立一个团体父母及其相关孩子的地图。所以我遍历每条记录(如果有更简洁的方式来查询地图,我很高兴听到它)并为它创建地图条目。
Map hierarchy = [:]
SubGroup.list().each { relation ->
if (!hierarchy[relation.parent]) {
hierarchy[relation.parent] = new HashSet()
}
hierarchy[relation.parent] << relation.child
}
我认为hibernate会使用一些简单的查询来做这样的事情:
select * from sub_group s, group c, group p
where s.child_id = c.group_id and s.parent_id = p.group_id
但它没有做连接。它正在对子组进行查询,然后对组表进行 n 次查询(N+1 选择问题)。啊。我听说在 2.0 中休眠查询缓存有问题,所以我禁用了它。我尝试为父列和子列添加lazy: false和fetch: join到我的 SubGroup 域类,但没有成功。我尝试将(fetch: [child: 'eager'])作为参数添加到 list 方法。它不会进行连接。我错过了什么吗?老实说,它甚至不需要进行连接,因为我只访问 groupId 外键属性,尽管稍后我将需要 key 和 title 属性。
当然,我可以将子属性和父属性设置为整数,并在我需要其余数据时进行自己的查询,或者我可以使用 HQL 和其他一些方法将其限制为单个查询,但似乎 GORM 应该为我做这件事。谢谢你的帮助。
问候,
吉姆