jpa的批量修改_java – JPA – 批量/批量更新 – 什么是更好的方法?

我发现JPA不支持以下更新:

Update Person p set p.name = :name_1 where p.id = :id_1,

p.name = :name_2 where p.id = :id_2,

p.name = :name_3 where p.id = :id_3

....

// It could go on, depending on the size of the input. Could be in 100s

所以我有两个选择:

选项1:

Query q = em.createQuery("Update Person p set p.name = :name where p.id = :id");

For ( int x=0; PersonsList.length; x++ ) {

// add name and id parameters

em.executeUpdate();

}

问题:

>这是批量更新所需要的吗?我还需要添加其他东西吗?

我设置了hibernate.jdbc.batch_size“,”20“

>默认情况下,此处是否启用了乐观锁定? (虽然我的实体中没有@Version)

>如果不是@Version,我需要做些什么来强制执行乐观锁定?

选项2:

使用Select Case语法或Criteria API构造一个单一查询

问题:

>批处理仍然在这里发生吗? (在一个大的查询中)

>在性能方面,这比第一种方法更好吗?

>这两个选项中推荐的方法是什么?还有其他更好的方法?

解决方法:

在您的问题标题中,您提到了批量更新和删除,但实际上您需要这次批量处理.

当您想要更新/删除所有匹配相同过滤条件的行时,需要Bulk Update and Delete,这些行可以在WHERE子句中表示.

在这里,您需要JDBC批量更新.如this article中所述,您需要设置以下配置属性:

如果你这样做,你可以简单地更新实体,Hibernate会为你批量UPDATE语句.

选项1不是很有用,因为它将生成无法批处理的N UPDATE语句.

选项2不是很有用,因为它会生成一个非常复杂的查询,其执行计划可能比在简单的批处理UPDATE语句中执行所有内容更复杂.

所以,这样做:

>使用分页获取实体

>使用Hibernate更新它们,让它为您进行批量更新.

如果您有许多此类实体,请使用分页,如this article中所述.

标签:java,hibernate,hql,where,jpql

来源: https://codeday.me/bug/20190529/1177580.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值