使用JPQL进行UPDATE和JOIN操作

3

关于JPQL的教程和示例通常涉及SELECT语句,有时是简单的UPDATE语句。我需要使用JOIN更新表。

我已经简化了我的环境:

KEY
= id
- counter

APPLET
= id
! key_id (1-1)

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

USER
= id
- login

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

我需要重置附加到用户登录“x”的每个KEY的计数器。

我尝试了一些带有UPDATE和JOIN的语法,但没有成功。有什么线索吗?

谢谢。

2个回答

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了解更多信息。

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


我会尝试这个,谢谢。我一直在使用NativeQuery,等待更优雅的JPQL解决方案。 - Zofren

2

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接