2

只是另一个关于 JPA 中多对多关系的问题。我的数据库中有以下结构:

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

现在我想将一个用户的分配更新为给定类型的项目。所以不幸的是我不能简单地做:

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 是没有选择的。

4

2 回答 2

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);

基本的集合操作。您可能应该将此逻辑封装到 User 实体的方法中。

于 2012-05-25T15:11:12.083 回答
0

如果 user2item 不能作为实体使用,则需要通过域模型来表达它。您的案例的替代解决方案是使用带有 Querydsl JPA 的本机查询或使用字符串形式的本机查询。

于 2012-05-29T06:24:21.923 回答