使用JPA更新多行

我想更新一个具有colum NAME值为’PCNAME’的表的所有字段。 我想要更新的表名是XYZ。我想只更新一些字段而不保持一些不变。

这将影响许多行而不是单行,因为将有许多行使用NAME =’PCNAME’如何使用JPA.I具有与此表关联的实体类。

您可以使用面向对象的方式或使用更新查询。

面向对象:

public void setNameOfAllEntities(String newname){ List items = entityManager.createQuery("from MyEntity", MyEntity.class) .getResultList(); for(MyEntity entity : items){ entity.setName(newname); } } 

使用Update Query(未经测试):

 public void setNameOfAllEntities(final String newname){ final int changes = entityManager.createQuery("update MyEntity set name = :name") .setParameter("name", newname) .executeUpdate(); System.out.println(changes + " rows changed"); } 

显然,第二版表现更好。

seanizer的答案是正确的(+1),批量更新对于这个用例确实很好。 但是您必须采取批量更新操作的一些预防措施。 解释JPA规范:

  • 批量更新绕过乐观锁定检查 (因此您必须手动增加版本列和/或根据需要手动validation版本列)
  • 持久化上下文不与批量操作的结果同步 (因此,在加载可能受影响的任何实体的状态之前,应在单独的事务中或在事务的最开始时执行批量操作)。

因此,我的建议是至少增加版本列以避免与其他线程的并发问题:

 UPDATE XYZ xyz SET xyz.name = :newname, xyz.version = xyz.version + 1 

并且在单独的事务中或在加载任何XYZ之前执行它,如前所述。

参考

  • JPA 1.0规范
    • 第4.10节“批量更新和删除操作”