我正在使用JPA 2.1,Oracle DB,并且具有要删除的实体的ID列表(约430000 ID)。最初,它是通过将ID列表拆分为具有1000个ID的每个较小的ID列表,并将它们作为JPQL的参数传递并执行而实现的。
delete from SOPFilter f where f.id in (?1)
然后,我想更改为使用JPA CriteriaDelete。

CriteriaDelete<SOPFilter> criteriaDelete = cb.createCriteriaDelete(SOPFilter.class);
Root<SOPFilter> from = criteriaDelete.from(SOPFilter.class);
criteriaDelete.where(from.get(SOPFilter_.id).in(sopFilterIds));

它运行良好,直到达到第90000个,并且有运行时异常导致其在此处停止



并关闭实体经理工厂。



对于谁,我的第一篇文章误导了这个异常(exception)



有一个catch子句可以通过在将记录抛出之前将记录添加到数据库中来处理运行时异常。为了添加事件记录,它尝试从现在关闭的工厂创建另一个实体管理器。
public static void logEvent(EntityManager em) {
    EntityManager em2 = null;
    EntityManagerFactory emFactory = em.getEntityManagerFactory();
    em2 = emFactory.createEntityManager();
    // ...
}

有人可以阐明它吗?

最佳答案

我的代码不清楚,但是您可能会遇到事务超时。您可以设置一个提示-

query.setHint("javax.persistence.query.timeout", 8000);

数据库端也可能存在超时

关于具有大量参数的JPA CriteriaDelete,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38974728/

10-12 00:37
查看更多