У меня есть 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);
Однако я не могу понять, как написать HQL-запрос, который будет преобразован в этот SQL, потому что таблица соединений deck_cards не имеет соответствующего класса домена grails. Я не могу написать этот оператор, используя обычные объединения, потому что HQL не позволяет вам использовать объединения в операторах удаления, и если я использую подзапрос, чтобы обойти это ограничение, mySQL жалуется, потому что вы не можете ссылаться на таблицу удаление из раздела «из» подзапроса.
Я также пытался использовать спящий режим каскада «удалить-осиротить», но это приводит к удалению всех карт при удалении колоды, даже если эти карты также принадлежат другим колодам. Я схожу с ума - кажется, это должно быть простым заданием.
редактировать
Кажется, есть некоторая путаница в этом конкретном использовании «колод» и «карт». В этом приложении «карты» - это карточки, и в колоде их может быть десятки тысяч. Кроме того, иногда необходимо сделать копию колоды, чтобы пользователи могли редактировать ее по своему усмотрению. В этом сценарии вместо того, чтобы копировать все карты, новая колода будет ссылаться на те же карты, что и старая колода, и если только карта будет заменена, будет создана новая карта. Кроме того, хотя я могу сделать это удаление в цикле в groovy, оно будет очень медленным и ресурсоемким, поскольку будет генерировать десятки тысяч операторов удаления sql, а не только 1 (используя вышеупомянутый sql). Нет ли способа получить доступ к свойству таблицы соединений в HQL?