나는 grails : decks와 cards에서 many-to-many 관계를 갖는 2 개의 도메인 클래스를 가지고있다.grails : many-to-many 관계에 대한 hql 쿼리에서 join 테이블에 접근하기
셋업은 다음과 같습니다 : 나는 갑판을 삭제 한 후
class Deck {
static hasMany = [cards: Card]
}
class Card {
static hasMany = [decks: Deck]
static belongsTo = Deck
}
가, 나 또한 더 이상 갑판에 속하는없는 카드를 모두 삭제합니다. 이 작업을 수행하는 가장 쉬운 방법은 다음과 같은 SQL과 같이 작성하는 것입니다 : 나는 테이블을 조인 때문에 SQL에 해결하는 HQL 쿼리를 작성하는 방법을 알아낼 수 없습니다, 그러나
delete from card where card.id not in(select card_id from deck_cards);
을 deck_cards, 않습니다 해당 grails 도메인 클래스가 없습니다. HQL은 delete 문에서 조인을 사용할 수 없기 때문에 하위 쿼리를 사용하면 테이블을 참조 할 수 없기 때문에 mySQL이이 제한을 피하기 위해 불만을 제기하기 때문에 일반 조인을 사용하여이 명령문을 작성할 수 없습니다. 하위 쿼리의 "보낸 사람"섹션에서 삭제합니다.
최대 절전 모드 "delete-orphan"캐스케이드 옵션을 사용해 보았지만 그 카드가 다른 데크에도 속하더라도 데크가 삭제 될 때 모든 카드가 삭제됩니다. 나는 미쳐 가고 있습니다 - 이것은 단순한 작업처럼 보입니다.
편집 "데크"및 "카드"의 특정 사용에 대해 약간의 혼란이있는 것 같습니다. 이 응용 프로그램에서 "카드"는 플래시 카드이며 갑판에는 수만 개가있을 수 있습니다. 또한 사용자가 적합하다고 편집 할 수 있도록 데크를 복사해야하는 경우가 있습니다. 이 시나리오에서는 모든 카드를 복사하는 대신 새 데크가 이전 데크와 동일한 카드를 참조하며 카드가 변경된 경우에만 새로운 카드가 만들어집니다. 또한 groovy의 루프에서이 삭제 작업을 수행 할 수 있지만 위의 SQL을 사용하여 1 개가 아닌 수천 개의 SQL 삭제 명령문을 생성하므로 매우 느리고 자원 집약적입니다. HQL에서 조인 테이블의 속성에 액세스 할 수있는 방법이 있습니까?
데크와 카드가이 응용 프로그램에서 작동하는 방식에 대해 좀 더 구체적으로 설명 했어야합니다. 이것은 플래시 카드 응용 프로그램이며 "갑판"은 수만 장의 카드를 가질 수 있습니다. 또한 사용자가 자신의 버전을 만들 수 있도록 데크를 복제해야하는 경우도 있습니다. 이 경우 수만 장의 카드를 복사하는 대신 다른 카드에 카드를 추가하기 만하면됩니다. 따라서 다 대다 관계가 있습니다. 또한, grails에서, belongsTo를 갖는 것은 many to many가 여전히 정확합니다. 나는 매우 비효율적이기 때문에 groovy에서 각 카드를 수동으로 반복하고 싶지 않습니다. –
같은 작은 숫자에 대한 효율성에 대해 걱정하지 마십시오. 또는 적어도 벤치 마크를 작성하고 시간을 확인하십시오. – Bozho