JPA多对多更新

JPA多对多更新,jpa,many-to-many,Jpa,Many To Many,只是另一个关于JPA中多对多关系的问题。我的数据库中有以下结构: ______ ___________ _______ | user | | user2item | | item | |------| |-----------| |-------| | id | | user_id | | id | | name | | item_id | | name | ------ ----------

只是另一个关于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。

如果我理解正确,您希望从项目列表中删除给定类型的所有项目,然后将其他项目添加到此列表中

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);
List items=user.getItems();
for(Iterator it=items.Iterator();it.hasNext();){
Item=it.next();
if(item.getType().equals(theType)){
it.remove();
}
}
items.addAll(newItemList);

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

如果我理解正确,您希望从项目列表中删除给定类型的所有项目,然后将其他项目添加到此列表中

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);
List items=user.getItems();
for(Iterator it=items.Iterator();it.hasNext();){
Item=it.next();
if(item.getType().equals(theType)){
it.remove();
}
}
items.addAll(newItemList);

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

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

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

感谢您的快速回答-这是我刚刚开始作为临时解决方案实施的方式。但是我认为一定有一种更优雅的方法可以使用奇特的JPA/QueryDSL特性来实现它。感谢您的快速回答-这是我刚刚开始作为临时解决方案实现的方法。但我认为一定有一种更优雅的方式来使用奇特的JPA/QueryDSL特性。