【问题标题】:UPDATE and JOIN with JPQL使用 JPQL 更新和加入
【发布时间】:2011-07-20 17:27:30
【问题描述】:

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

我已经简化了我的环境:

钥匙
= 身份证
- 计数器

小程序
= 身份证
! key_id (1-1)

设备
= 身份证
! applet_id (1-1)
! user_id (1-n)

用户
= 身份证
- 登录

一个设备有一个独特的小程序,它有一个独特的键集。但是一个用户可以拥有多个设备。

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

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

谢谢。

【问题讨论】:

    标签: jpa join jpql


    【解决方案1】:

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

    也许是这样的,

    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 解决方案。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 2018-10-01
      • 2011-12-08
      • 2018-03-13
      • 2013-07-09
      • 1970-01-01
      • 2017-06-20
      • 2011-09-17
      • 2011-07-07
      相关资源
      最近更新 更多