使用CriteriaBuilder一次删除多个对象

时间:2014-08-06 09:16:47

标签: java hibernate jpa criteria-api

我正在尝试使用CriteriaBuilder API通过一个查询删除一堆对象。我正在寻找像这样的选择:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> query = criteriaBuilder.createQuery(entityClass);
Root<T> root = query.from(entityClass);
query.select(root).where(/*some condition*/);
return entityManager.createQuery(query).getResultList();

然后删除而不是选择。据我所知,remove上没有deleteCriteriaQuery方法。是否可以使用此API?

我当然可以执行select,然后为每个结果调用entityManager.remove(object),但这样效率非常低。

2 个答案:

答案 0 :(得分:16)

试试这个:

CriteriaBuilder criteriaBuilder  = entityManager.getCriteriaBuilder();
CriteriaDelete<SomeClass> query = criteriaBuilder.createCriteriaDelete(SomeClass.class);
Root<SomeClass> root = query.from(SomeClass.class);
query.where(root.get("id").in(listWithIds));

int result = entityManager.createQuery(query).executeUpdate();

where子句可以看起来像这样:

query.where(criteriaBuilder.lessThanOrEqualTo(root.get("id"), someId));

答案 1 :(得分:6)

在JPA 2.1中,Criteria API完全符合您的要求。它看起来像这样:

CriteriaBuilder cBuilder = em.getCriteriaBuilder();
CriteriaDelete<T> cq = cBuilder.createCriteriaDelete(entityClass);
Root<T> root = cq.from(entityClass);
cq.where(/*some codition*/);
int result = em.createQuery(cq).executeUpdate();

您可以参加JPA 2.1 SPEC和API here