Grails で多対多の関係を持つ 2 つのドメイン クラスがあります: デッキとカードです。
セットアップは次のようになります。
class Deck {
static hasMany = [cards: Card]
}
class Card {
static hasMany = [decks: Deck]
static belongsTo = Deck
}
デッキを削除した後、デッキに属さないカードもすべて削除したいです。これを実現する最も簡単な方法は、次の sql のようなものを記述することです。
delete from card where card.id not in(select card_id from deck_cards);
ただし、結合テーブルであるdeck_cardsには対応するgrailsドメインクラスがないため、このSQLに解決されるHQLクエリを作成する方法がわかりません。HQL では delete ステートメントで結合を使用できないため、通常の結合を使用してこのステートメントを作成することはできません。また、サブクエリを使用してこの制限を回避すると、mySQL が文句を言います。サブクエリの「from」セクションで from を削除します。
また、休止状態の「delete-orphan」カスケード オプションを使用してみましたが、その結果、デッキが削除されると、それらのカードが他のデッキにも属している場合でも、すべてのカードが削除されます。私は夢中になっています - これは簡単な作業のようです。
編集 「デッキ」と「カード」のこの特定の使用法については、混乱があるようです。このアプリケーションでは、「カード」はフラッシュカードであり、デッキには何万枚もある可能性があります。また、ユーザーが必要に応じて編集できるように、デッキのコピーを作成する必要がある場合もあります。このシナリオでは、すべてのカードをコピーするのではなく、新しいデッキは古いデッキと同じカードを参照するだけで、カードが変更された場合にのみ新しいカードが作成されます。また、この削除は groovy のループで実行できますが、(上記の SQL を使用して) 1 つではなく数万の SQL 削除ステートメントが生成されるため、非常に遅く、リソースを大量に消費します。HQL で結合テーブルのプロパティにアクセスする方法はありませんか?