0

我正在尝试构建我称为组的类的层次结构。域相当简单:

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: falsefetch: join到我的 SubGroup 域类,但没有成功。我尝试将(fetch: [child: 'eager'])作为参数添加到 list 方法。它不会进行连接。我错过了什么吗?老实说,它甚至不需要进行连接,因为我只访问 groupId 外键属性,尽管稍后我将需要 key 和 title 属性。

当然,我可以将子属性和父属性设置为整数,并在我需要其余数据时进行自己的查询,或者我可以使用 HQL 和其他一些方法将其限制为单个查询,但似乎 GORM 应该为我做这件事。谢谢你的帮助。
问候,

吉姆

4

1 回答 1

0

似乎我可以在不为每个孩子和父母进行选择调用的情况下让它工作的唯一方法是改为执行 HQL 查询,而不是使用 list 方法,如下所示:

Map hierarchy = [:]
def subGroups = SubGroup.executeQuery("SELECT s.parent, s.child FROM SubGroup s")
subGroups.each { relation ->
    if (!hierarchy[relation[0]]) {
        hierarchy[relation[0]] = new HashSet()
    }

    hierarchy[relation[0]] << relation[1]
}

因此,我实际上只使用 SubGroup 域类来定义关系。我想我应该能够通过某种映射来做到这一点,但我不知道怎么做。

于 2012-11-20T23:04:09.843 回答