【问题标题】:JPA / JPQL - bulk updateJPA / JPQL - 批量更新
【发布时间】:2011-07-07 21:37:00
【问题描述】:

我必须对表执行批量更新。 做一个快速的例子:

 UPDATE Book b SET b.amount = b.amount + 1 WHERE b IN ( :books )

问题在于 b.amount 可以是 NULL 值或 int,如果存在 NULL 值,它应该表现为 b.amount 等于 1。

在 JPA/JPQL 中是否有任何“强制转换”或任何其他解决此问题的方法,

提前谢谢你,

问候, P

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    你应该可以使用COALESCE:

    UPDATE Book b SET b.amount = COALESCE(b.amount, 1) + 1 WHERE b IN ( :books ) 
    

    【讨论】:

    • 这是特定于 JPA 还是特定于 Hibernate,因为我不想依赖于提供程序?
    • @redbull:它是在 JPA 2.0 中引入的,在 JPA 2.0 之前它是特定于 Hibernate 的。
    • 谢谢你,正是我需要的,up!
    【解决方案2】:

    我会先用一个单独的查询来修复空值:

    UPDATE Book set b.amount = 0 WHERE b.amount IS NULL
    

    如果null 不是您的逻辑的合法值,则也无法插入。例如有它@Column(nullable=false)

    【讨论】:

    • 从长远来看,这似乎是一种更好的方法(我稍后会使用),但目前我没有这种灵活性
    【解决方案3】:

    我使用以下方式从当前的 JPA 提供者获取 JDBC 连接。

    SessionImplementor si = (SessionImplementor) em.unwrap(Session.class);
    Connection connection = si.getJdbcConnectionAccess().obtainConnection();
    PreparedStatement pstmt = connection.prepareStatement("...");
    // Do something
    pstmt.addBatch();
    pstmt.executeBatch();
    si.getJdbcConnectionAccess().releaseConnection(connection);
    

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2013-07-11
      • 2011-11-13
      • 2013-04-01
      • 2011-12-08
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多