3

Hibernate (GORM) を使用して Grails プロジェクトに取り組んでいます。次のドメイン モデルがあります。

ClientContact {
   static hasMany = [owners: Person]
   static belongsTo = [Person]
}

Person {
   static hasMany = [clientContacts: ClientContact]
}

ClientContacts特定の所有者 ( ) のすべてを取得しようとすると、Person面白い問題が発生します。次のクエリ基準を使用しています。

def query = {
   owners {
      eq("id", Long.parseLong(params.ownerId))
   }
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query) 

問題は、結果のそれぞれを反復処理すると、所有者が 1 人ClientContactsしかいないことです。実際には、ほとんどの場合、他の多くの所有者がいます。何を与える?hibernate/GORM が遅延フェッチを使用していることは知っていますが、アクセスしようとすると、他のすべての所有者がフェッチされると思いました。ClientContact

何かご意見は?list()関数はいくつかの優れたページング機能を提供するため、引き続き使用したいと考えています。

4

3 に答える 3

3

このスレッドが非常に古いことは知っていますが、今日まったく同じ問題に遭遇したばかりで、解決策はエイリアスの使用であるように思われるため、代わりに:

def query = {
        owners {
                eq("id", Long.parseLong(params.ownerId))
        }
}

試すことができます:

def query = {
        createAlias("owners", "o")
        eq("o.id", Long.parseLong(params.ownerId))
}

最初のクエリは左外部結合を作成し、2 番目のクエリは内部結合を作成します。詳細な説明については、次のリンクを参照してください: http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html

于 2012-01-27T15:14:34.250 に答える
0

2 つの簡単な観察:

  1. [Grails ドキュメント]( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.1.3 Many-to-many) には、多対多の関連付けは手動でコーディングする必要がありますが、デフォルトの足場ではそれができません。
  2. eqId()基準を使用する必要がある場合があります - createCriteriaを参照してください
于 2008-11-01T00:05:15.347 に答える
0

id と version はすべての GORM クラスの特別なプロパティです。クラス宣言でそれらを指定する必要はなく、標準的な基準を使用することはできません。

間違いなく eqID 基準を使用する必要があります

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
于 2008-11-22T22:48:19.357 に答える