1

3つのドメインクラスがあるとしましょう。3番目のクラスを介して相互に関連する2つのクラスです。

わかりました、いくつかのコード:

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]
}

かなりクリアな?そうだといい。これは私のドメインで完全に機能します。

Aオブジェクトに関連するCインスタンスの数を計算するために使用される一時プロパティnumberOfCsを確認できます。そして、それはうまく機能します。

問題:すべてのAオブジェクトを一覧表示し、Cオブジェクトとの関係の数で並べ替えたいのですが、一時プロパティnumberOfCsをスコープに使用できません。

どうすれば状況に対処できますか?通常の(一時的ではない)フィールドのように、AsリストをnumberOfCsで並べ替えるようにGORMに指示するにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

1

Grailsの基準がこれをサポートしているかどうかはわかりません。これは、Aオブジェクト自体を選択することと、子オブジェクト(C)によって集約することの両方が必要だからです。これは、すべてのA'sフィールドでグループ化することを意味しますが、これは自動的には行われません。

Aの一部のフィールドのみが必要な場合は、それらでグループ化できます。

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

それ以外の場合は、この質問idのように、sのみを取得して2番目のクエリを作成する必要があります。

もう1つの方法は、ここで説明するような派生プロパティを使用することです(ただし、機能するかどうかはわかりません)。

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

私はあなたのProblemGORMに関連しているとは考えていませんが、むしろ一般的なHibernateまたはSQLに関連していると考えています。

HQLDocuを見てください。それらは多くの例です。

次の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 に答える