Hibernate基準-フェッチされた単一オブジェクト
質問
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つの簡単な観察:
- [Grailsドキュメント]( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.1.3 多対多く)は、多対多の関連付けを手動でコーディングする必要があると言いますが、デフォルトのscaffoldはそれを行いません。
-
eqId()
基準を使用する必要がある場合があります- createCriteria
idとversionは、すべてのGORMクラスの特別なプロパティです。クラス宣言でそれらを指定する必要はありません。また、標準の基準を使用することはできません。
必ずeqID基準を使用する必要があります
def query = {
owners {
eqId(Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)
所属していません StackOverflow