JPA批量更新声明

时间:2015-05-07 15:46:15

标签: sql jpa

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

Update Table name set valstring = ? where valstring  = ? and ID in (?)

所以JPA交易是

em.CreateNativeQuery(Update_QUERY).setParameter(1, updatedStatus).setParameter(2,currentStatus).setParameter(3,ids).executeUpdate();

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

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

2 个答案:

答案 0 :(得分: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();

三个简单的规则:

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

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

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

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

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

答案 1 :(得分:0)

设置列表参数

JPA Query接口setParameter方法接受一个Object参数:

Query setParameter(String name, Object value)

可以将List作为参数值。

这对于JPQL,Criteria API或批量更新和删除查询的工作方式相同:

List<Post> posts = entityManager.createNativeQuery("""
    UPDATE 
        post
    SET 
        status = :newStatus
    WHERE 
        status = :oldStatus AND
        id IN :ids

    """, Post.class)
.setParameter("oldStatus", PostStatus.PENDING)
.setParameter("newStatus", PostStatus.APPROVED)
.setParameter("ids", List.of(1L, 2L, 3L))
.executeUpdate();

有关使用JPA和Hibernate执行批量更新和删除语句的更多详细信息,请同时查看this article