使用JPQL更新和加入

时间:2011-03-22 18:02:41

标签: jpa join jpql

关于JPQL的教程和示例总是处理SELECT语句,有时还处理简单的UPDATE语句。我需要用连接更新表。

我简化了我的环境:

KEY
= id
- 柜台

APPLET
= id
! key_id(1-1)

DEVICE
= id
! applet_id(1-1)
! user_id(1-n)

USER
= id
- 登录

设备具有唯一的applet,该applet具有唯一的键集。但是用户可以拥有多个设备。

我需要重置连接到USER登录名“x”的每个KEY的计数器。

我尝试了UPDATE和JOIN的一些语法,没有成功。任何线索?

谢谢。

2 个答案:

答案 0 :(得分:7)

你尝试了什么,你得到了什么错误?你的对象模型是什么?

也许是这样的,

Update Key k set k.counter = 0 where exists (Select u from User u join u.devices d where u.login = "x" and d.applet.key = k)

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/JPQL_BNF#Update

您也可以选择对象并在内存中重置计数器并提交更改。

答案 1 :(得分:0)

JPQL不支持批量更新操作中的联接操作。 编辑查询(nativeQuery = true)时,您可以加入。

查询应根据数据库中的字段进行。

      @Transactional
      @Modifying
      @Query(nativeQuery = true,
          value = "UPDATE Team t" +
          " SET current = :current " +
          " FROM " +
          "   members," +
          "   account" +
          " WHERE " +
          "   members.members_id = t.members_id " +
          "   AND members.account_id = :account " +
          "   AND t.current = :current_true ")
      int updateTeam(
        @Param("current") String current,
        @Param("account") Long account,
        @Param("current_true") Integer current_true);