我正在尝试使用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
上没有delete
或CriteriaQuery
方法。是否可以使用此API?
我当然可以执行select,然后为每个结果调用entityManager.remove(object)
,但这样效率非常低。
答案 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