Grails 戈姆没有加入

Grails 戈姆没有加入,grails,gorm,Grails,Gorm,我试图建立一个我称之为group的类的层次结构。这个领域相当简单: class SubGroup implements Serializable { Group child Group parent static mapping = { id composite: ['child', 'parent'] } } class Group implements Serializable { int groupId

我试图建立一个我称之为group的类的层次结构。这个领域相当简单:

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
}
但它并没有加入。它先查询子组,然后再查询组表(n+1选择问题)。啊。我听说在2.0中,hibernate有问题,所以我禁用了它。我已尝试将父列和子列的lazy:falsefetch:join添加到我的子组域类中,但没有成功。我尝试将(fetch:[child:'eager'])作为参数添加到list方法中。它不会进行连接。我错过什么了吗?老实说,它甚至不需要进行连接,因为我只访问groupId外键属性,尽管稍后我将需要key和title属性

当然,我可以将子属性和父属性设置为int,并在需要其余数据时执行自己的查询,或者我可以使用HQL和其他方法将其限制为单个查询,但看起来GORM应该为我执行此操作。谢谢你的帮助。
问候,


Jim

看来,在hibernate不为每个孩子和家长进行select调用的情况下,我实现这一点的唯一方法是执行HQL查询,而不是使用列表方法,如下所示:

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]
}
Map层次结构=[:]
def subGroups=SubGroup.executeQuery(“从子组s中选择s.parent,s.child”)
子群.each{关系->
如果(!层次结构[关系[0]]){
层次结构[关系[0]]=新哈希集()
}

hierarchy[relation[0]]我想您对hibernate(GORM下的层)是如何工作的还不太了解persistent framework可以工作。我建议您在开始使用grails/gorm之前先阅读一些关于Hibernate的好书。嗯,我承认我是grails甚至Hibernate的新手,但您可以尝试为我的问题提供解决方案,而不是屈尊地暗示Hibernate不是什么。
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]
}