Grails GORM查询多个级联的一对多关系级别

时间:2013-11-19 23:21:24

标签: grails gorm

在Grails中,我有以下4个域类:

package com.whatever.ts4

class A_class {
   String aName
   static hasMany = [b_class: B_class]
}

package com.whatever.ts4

class B_class {
   String bName
   A_class a_class
   static hasMany = [c_class: C_class]
   static belongsTo = [A_class]
}

package com.whatever.ts4

class C_class {
   String cName
   B_class b_class
   static hasMany = [d_class: D_class]
   static belongsTo = [B_class]
}

package com.whatever.ts4

class D_class {
   Long rowNumber
   String dataValue 
   C_class c_class
   static belongsTo = [C_class]  
}

简单的ER图: A_class 1 =>很多B_class 1 =>很多C_class 1 =>很多D_class

我在BootStrap.groovy中成功填充了它们

现在,给定一个A_class id,我需要获得一个包含这些列的集合:

aName,bName,cName,rowNumber,dataValue

我可以使用namedQueries吗?

我已经尝试将它放在A_class域类中:

static namedQueries = {
   myNamedQuery { aid ->          
      createAlias b_class,'b'
      createAlias 'b.c_class','c'
      createAlias 'c.d_class','d'         
      eq 'id',aid
   }
}

我喜欢命名查询的想法,因为需要为不同的A_class id返回此结果集。我可以利用服务来准备数据,并通过控制器调用它,将其渲染为JSON(我离题)。但是,也许有一种Groovier方式?

1 个答案:

答案 0 :(得分:0)

您不需要针对此类操作的命名查询。您将从A_class实体获取所需的所有信息。例如:

def a_class_entity = A_class.get(id) 
def b_names = a_class_entity.b_class.bName // set of all bNames 

//<-- Not sure if flatten() works with spread collection fields, but it should -->
def c_names = a_class_entity.b_class.c_class.flatten().cName // collection of all cNames
def rowNumbers = a_class_entity.b_class.c_class.d_class.flatten().rowNumber // collection of all rowNumbers 
def dataValues = a_class_entity.b_class.c_class.d_class.flatten().dataValue // collection of all dataValues