У меня есть 2 доменных класса с отношениями "многие ко многим" в Grails: колоды и карты.
Настройка выглядит следующим образом:
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?