1

假设我们有 3 个域类:2 个类通过第 3 个类相互关联。

好的,一些代码:

class A {
     String subject
     String description

     static hasMany = [cs: C]

     static transients = ['numberOfCs']

     Long getNumberOfCs() {
         return cs.size()
     }
}

class B {
     String title
}

class C {
     A objectA
     B objectB

     static belongsTo = [a: A]
}

很清楚吗?但愿如此。这与我的域完美配合。

可以看到瞬态属​​性numberOfCs,用来计算我的A对象相关的C实例个数。它工作得很好。

问题:列出我所有的 A 对象,我想按与 C 对象的关系数对它们进行排序,但是瞬态属性 numberOfCs 不能用于范围。

我该如何处理这种情况?我如何告诉 GORM 按 numberOfCs 对 As 列表进行排序,因为它是一个常规(非瞬态)字段?

提前致谢。

4

2 回答 2

1

我不确定 Grails 的标准是否支持这一点,因为您既需要选择 A 对象本身,又需要通过子对象 ( C) 进行聚合。这意味着按所有 's 字段分组A,这不是自动完成的。

如果您只需要 A 中的一些字段,则可以按它们分组:

def instances = A.withCriteria {
  projections { 
    groupProperty('subject')
    count('cs', 'cCount')
  }
  order 'cCount'
}

否则你只需要检索ids 并进行第二次查询,就像在这个问题中一样。

另一种方法是使用此处描述的派生属性(但不确定它是否会起作用):

class A {
    static mapping = {
        numberOfCs formula: 'select count(*) from C where c.b_id = id'
    }
}
于 2012-09-05T14:06:17.493 回答
0

我不会考虑您的问题 GORM 相关,而是一般的 Hibernate 甚至 SQL 相关。

看看HQL Docu他们有很多例子。

检查以下 HQL 非常接近您的要求。

select mySortedAs from A mySortedAs left join mySortedAs.cs myCsOfA order by              
count(myCsOfA)

我想我在某处看到您也可以执行类似 myCsOfA.length 或 myCsOfA.size 的操作

于 2012-09-06T16:59:27.337 回答