2012-05-25 74 views
2

另一個關於JPA多對多關係的問題。我在我的數據庫中有以下結構:JPA多對多更新

______  ___________  _______ 
| user | | user2item | | item | 
|------| |-----------| |-------| 
| id | | user_id | | id | 
| name | | item_id | | name | 
------  -----------  | type | 
           ------- 

現在我想更新從一個用戶到給定類型的項目的assingment。所以很不幸,我不能簡單地這樣做:

user.setItems(newItemList); 

因爲它會刪除其他類型的項目的分配。在普通的舊SQL我會這樣做:

DELETE FROM user2item WHERE user_id = ? AND item_id IN (SELECT id FROM item WHERE type=?); 
INSERT INTO user2item (user_id, item_id) VALUES(?,?); 

但是,因爲我使用JPA與QueryDSL普通SQL是沒有選擇。

回答

0

如果我理解正確,您想從項目列表中刪除給定類型的所有項目,然後將其他項目添加到此列表中。

List<Item> items = user.getItems(); 
for (Iterator<Item> it = items.iterator(); it.hasNext();) { 
    Item item = it.next(); 
    if (item.getType().equals(theType)) { 
     it.remove(); 
    } 
} 
items.addAll(newItemList); 

基本集合操作。您應該將此邏輯封裝到用戶實體的方法中。

+0

感謝您的快速回答 - 這是我剛開始實施的臨時解決方法。但我認爲必須有一種更優雅的方式來使用花哨的JPA/QueryDSL功能。 – LordHelmchen

0

如果user2item不可用作爲實體,則需要通過域模型表示它。您的案例的替代解決方案是使用帶有Querydsl JPA的本機查詢或以字符串形式使用本機查詢。