2

JPAにおける多対多の関係に関するもう1つの問題。データベースには次の構造があります。

 ______      ___________      _______
| 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(?,?);

しかし、QueryDSLでJPAを使用しているので、プレーン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 に答える