2010-12-20 214 views
2

我想了好几天从我的数据收到一个列表。域看起来是这样的:Grails表或列表中的其他列

class Alpha {  
    String a 
    String b 
    etc. 
    static hasMany = [beta:Beta] 

} 

class Beta { 
    String a 
    Integer foo 
    String status 
    static belongsTo = [alpha:Alpha] 
    static constraints = { 
     status(nullable:false, inList:["val1","val2","val3", "val4"]) 
    } 
} 

我想阿尔法都Beta.foo和所有Beta.foo的总和一定的地位。最好会像一个额外的行(Integer sumVal1 ...)。

我试图命名查询:

static namedQueries = { 
     erledigterProbeAufwend { 
      createAlias ('Beta', 'b') 
      eq ('b.status', 'val1') 
      projections { 
       groupProperty('b.alpha') 
       sum('b.foo', 'sumFooVal1') 
      } 
     } 
} 

但这只是给我一个和在同一时间。

我期待着得到一些帮助。

问候 巴斯

回答

3

这可以计算formula field,但有subquery trick

static mapping = { 
    betaCount formula: "(SELECT count(*) FROM Beta b WHERE b.alpha_id = id and b.status in('a', 'b'))" 
} 
+0

非常感谢您的快速回答。它工作得很好:) – Bas 2010-12-21 10:07:55

+0

它完美的作品!我想发布我的案例,作为另一个例子: 'totalFilhos公式:'(SELECT count(*)FROM atendatement a WHERE a.atendimento_pai = cod_atendimento)'' – 2015-05-22 20:21:13

+0

以及如果您不想要count(*) ',但所有线路都有相同的技巧? – 2015-05-28 16:15:57

0

在Alpha类创建瞬时变量和onload事件进行填充。

class Alpha {  
    String a 
    String b 
    etc. 
    static transients = ["sumVal1",...] 
    static hasMany = [beta:Beta] 

    def onLoad = { 
     sumVal1 = .... 
    }  

} 
+0

我怀疑它的更好,然后具有阿尔法:'高清getVal1(){{beta.findAll在it.status ['一','b']}。sum()}'并且懒惰地查询它。当检索a.beta时,它会运行额外的查询。 – 2010-12-20 15:52:28