我发现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