2012-05-25 57 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的本机查询或以字符串形式使用本机查询。