JPA批量更新声明

ave*_*t12 0 sql jpa

我有一个像这样的更新查询

Update Table name set valstring = ? where valstring  = ? and ID in (?)
Run Code Online (Sandbox Code Playgroud)

所以JPA交易是

em.CreateNativeQuery(Update_QUERY).setParameter(1, updatedStatus).setParameter(2,currentStatus).setParameter(3,ids).executeUpdate();
Run Code Online (Sandbox Code Playgroud)

方法的输入是List id,currentStatus和updatedStatus

如何将List作为单个参数传递,如果我将List转换为逗号分隔的String我得到错误指定的文本不是数字,因为In子句中不允许使用字符串

wyp*_*prz 6

如何将List作为单个参数传递

一个示例方法:

String jpql = "UPDATE NameEntity ne " + 
              "SET ne.valstring = :updated_status " +
              "WHERE ne.valstring = :current_status AND ne.id IN :ids";
em.createQuery(jqpl)
  .setParameter("updated_status", updatedStatus)
  .setParameter("current_status", currentstatus)
  .setParameter("ids", Arrays.asList(ids))
  .executeUpdate();
Run Code Online (Sandbox Code Playgroud)

三个简单的规则:

  1. 使用本机SQL对映射到实体的表进行批量更新/删除.

    本机SQL查询可以绕过持久性上下文(一组托管实体)直接在数据库表上工作,因此如果给定的数据库表没有相应的实体,则可以安全地使用此类查询.

  2. 使用JPQL对映射到实体的表进行批量更新/删除

    如果给定的数据库表由实体映射,则使用SQL更新/删除将导致持久性上下文与底层数据库之间的不一致,因此使用JQPL对应项而持久性提供程序将处理一致性.

  3. 批量更新/删除应作为事务中的第一个操作执行,或者理想情况下在其自己的事务中执行.