【问题标题】:Grails many to many with 3 classes: sorting by the number of relationships具有 3 个类的多对多 Grails:按关系数排序
【发布时间】:2012-08-30 03:28:09
【问题描述】:

假设我们有 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 列表进行排序,因为它是一个常规(非瞬态)字段?

提前致谢。

【问题讨论】:

    标签: sorting grails many-to-many grails-orm transient


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,但我不是在问如何按计数排序一个简单的查询,而是如何对列表进行排序导致具有瞬态字段的 gsp。你的答案只是我正在寻找的一部分。查看 Victor 报告的链接,了解我应用的解决方案。
    • 答案是 GORM/Hibernate 不能满足你的要求。 Hibernate 不知道您的瞬态字段,也不知道您的方法内部发生了什么。 Hibernate 只是一个 ORM 框架。您可以获得的关闭是 1. 公式,2. 正确查询 3. 检索后手动排序。
    【解决方案2】:

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

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

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

    否则您只需要检索ids 并进行第二次查询,例如in this question

    另一种方法是使用derived properties 就像描述的here 一样(但不确定它是否会起作用):

    class A {
        static mapping = {
            numberOfCs formula: 'select count(*) from C where c.b_id = id'
        }
    }
    

    【讨论】:

    • 好的,这个公式对我不起作用,我也没有尝试过 withCriteria。但是我使用通过 2 个单独的查询检索 id 的解决方案,如您链接我的这个答案中所示。如果您编辑答案以使其对任何人都更可见,我可以接受。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2014-08-25
    • 2023-03-18
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多