使用CriteriaBuilder一次删除多个对象

Jor*_*orn 9 java hibernate jpa criteria-api

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

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();
Run Code Online (Sandbox Code Playgroud)

但后来删除而不是选择.据我所知,没有removedelete方法CriteriaQuery.是否可以使用此API?

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

gua*_*ian 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();
Run Code Online (Sandbox Code Playgroud)

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

query.where(criteriaBuilder.lessThanOrEqualTo(root.get("id"), someId));
Run Code Online (Sandbox Code Playgroud)


小智 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();
Run Code Online (Sandbox Code Playgroud)

你可以在这里申请JPA 2.1 SPEC和API