【发布时间】:2011-01-02 09:48:00
【问题描述】:
我在 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);
但是,我不知道如何编写将解析为该 SQL 的 HQL 查询,因为连接表 deck_cards 没有相应的 grails 域类。我无法使用普通连接编写此语句,因为 HQL 不允许您在删除语句中使用连接,并且如果我使用子查询来绕过此限制,mySQL 会抱怨,因为不允许您引用您所在的表从子查询的“from”部分删除。
我也尝试使用休眠“删除孤儿”级联选项,但这会导致在删除牌组时删除所有牌,即使这些牌也属于其他牌组。我快疯了 - 这似乎应该是一项简单的任务。
编辑 对于“套牌”和“卡片”的这种特定用途似乎有些混淆。在这个应用程序中,“卡片”是抽认卡,一副牌中可能有数万张。此外,有时需要制作套牌的副本,以便用户可以根据需要对其进行编辑。在这种情况下,新牌组不会复制所有牌,而是只引用与旧牌组相同的牌,如果只有一张牌被更改,就会创建一张新牌。此外,虽然我可以在 groovy 的循环中执行此删除操作,但它会非常缓慢且占用大量资源,因为它会生成数万条 sql 删除语句,而不仅仅是 1 条(使用上面的 sql)。有没有办法在 HQL 中访问连接表的属性?
【问题讨论】:
标签: sql hibernate grails hql grails-orm