1

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

UPDATE 
    table_name 
SET 
    column_name = ? 
WHERE
    column_name = ? AND id in (?)

所以JPA事务是

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

该方法的输入是 List id、currentStatus 和 updatedStatus

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

4

2 回答 2

10

如何将列表作为单个参数传递

一个示例方法:

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 对应物,持久性提供程序将负责一致性。

  3. 批量更新/删除应作为事务中的第一个操作执行,最好在其自己的事务中执行。

于 2015-05-07T21:53:48.850 回答
0

设置列表参数

接受参数的 JPAQuery接口方法:setParameterObject

Query setParameter(String name, Object value)

可以将 aList作为参数值。

这对 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 执行批量更新和删除语句的更多详细信息,请查看这篇文章

于 2020-08-11T13:33:21.580 回答