4

前の質問への回答 (回答はこちら: SQL/Database Views in Grails ) に従って、ドメイン クラスを使用してデータベース内のビューを表現しようとしました。ただし、ほとんどの場合、これはうまく機能します。

一意のキーが 1 つもないビューがあります。基になるテーブルが次のようになっているとします。

A:
id,varX
1,"Blah"
2,"Foo"
3,"Bar"

B:
id、A.id、C.id
1,2,1
2,2,2
3,3,1

C:
id,varY
1,"ブーム"
2,"フィズル"

私のビューは次のようになります:
A.id,varX,B.id,C.id,varY
1,"Blah",NULL,NULL,NULL
2,"Foo",1,1,"Boom"
2,"Foo" ,2,2,"フィズル"
3,"バー",3,1,"ブーム"

それこそが、私たちの目的にとってまさにそのように見えるべきです。ただし、ご覧のとおり、ビューに対して作成できる最適な一意の複合 ID は ['A.id','C.id'] です。これは各要素を一意に識別するためですが、Grails は処理できないように見えるため失敗します。複合 ID の一部が NULL である (実際には、list() は 4 つのオブジェクトのリストを返します。最初のオブジェクトはヌル ポインターで、残りはビューの実際のドメイン インスタンスです)。

A.id と B.id を使用することもできますが、同じ問題があることに注意してください。

また、テーブル A の要素を少なくとも 1 回 (テーブル B/C に見つからないフィールドには null 値を使用して) 表示したいことにも注意してください。テーブル B に複数の対応するエントリがある場合は、おそらく何度も表示します。

だから、私の質問は 2 つの部分です:
1: ID フィールドがまったくない grails ドメインクラスを定義することは可能ですか? ビュー エントリの永続的なハンドルは必要ありません。そのビューのデータを一覧表示するだけで済みます。
2: そうでない場合、複合 ID フィールドを持つ grails ドメイン クラスを定義することは可能ですか?

関連するドメイン クラスを使用せずに直接 Groovy SQL を使用してビューを直接クエリできることはわかっていますが (現在実際にこれを行っています)、理想的にはドメイン クラスでビューを表現したいと考えています。さらに、すべての議論は別として、これら 2 つの質問は、特定の問題だけに適用するよりも、はるかに一般的に適用できます。

4

2 に答える 2

3

以前にその問題がありました。

私の経験では、複合 ID は Grails や Hibernate では十分にサポートされていません。

私たちは常に、すべてのドメイン クラスに対して一意の ID を持つ方法を見つけています。

実際のテーブルでは、grails を使用していなければ複合キーを使用していたとしても、自動インクリメント フィールドを追加するだけです。

データベース ビューの場合、通常、結合されたテーブルの 1 つに既に ID があり、そのコンテキストで一意になりますが、そうでない場合は、これをハック/シミュレートする方法があります。たとえば、SQL では、複合キーで使用するキーを 1 つのフィールドとして連結し、これをキーとして使用します。

于 2009-07-21T23:19:05.327 に答える
1

このリファレンスページでコンポジットIDセクションに記載されていることを試しましたか?私はそれを自分で使ってみたことがなく、これが最新バージョンで変更されたかどうかはわかりません。

また、表Bを見ると、A.idの値は2と3だけなので、A.idが1の場合、B.id、C.id、varYの結果はnullになると思いませんか?それとも単なる例としての意味でしたか?

于 2009-01-10T03:36:19.247 に答える