質問

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

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

Person {
   static hasMany = [clientContacts: ClientContact]
}

特定の所有者( Person )ですべての ClientContacts を取得しようとすると、おかしな問題が発生します。次のクエリ条件を使用しています:

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

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

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

役に立ちましたか?

解決

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

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

他のヒント

2つの簡単な観察:

  1. [Grailsドキュメント]( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.1.3 多対多く)は、多対多の関連付けを手動でコーディングする必要があると言いますが、デフォルトのscaffoldはそれを行いません。
  2. eqId()基準を使用する必要がある場合があります- createCriteria

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

必ずeqID基準を使用する必要があります

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top