2014-02-27 106 views
4

我想删除(JPA 2.1)所有的“患者”,从一个“医院”,但碰到一个问题: “UPDATE/DELETE标准查询不能定义连接”如何删除删除连接表实体JPA 2.1 CriteriaDelete

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaDelete<PatientEntity> delete = cb.createCriteriaDelete(PatientEntity.class); 
Root<PatientEntity> root = delete.from(PatientEntity.class); 
Join<PatientEntity, HospitalEntity> join = root.join(PatientEntity_.Hospital); 
delete.where(cb.equal(join.get(HospitalEntity_.id), id)); 
Query query = entityManager.createQuery(delete); 
query.executeUpdate(); 

错误:

UPDATE/DELETE criteria queries cannot define joins 

我应该如何删除所有的患者,而加入不能执行?

+0

使用JPA的查询,而不是因为它是类型安全的这是不一样的标准很复杂... – user3252538

+0

这也不是办法,要求OP使用技巧周围的其他方式,尽管实际问题提供解决方案。 – srk

回答

3

您可以使用选择“在”条款适当的实体和一个子查询。

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaDelete<PatientEntity> delete = cb.createCriteriaDelete(PatientEntity.class); 
Root<PatientEntity> root = delete.from(PatientEntity.class); 


       Subquery<PatientEntity> subquery = delete.subquery(PatientEntity.class); 
       Root<PatientEntity> root2 = subquery.from(PatientEntity.class); 
       subquery.select(root2); 
       /* below are narrowing criteria, based on root2*/ 
       Join<PatientEntity, HospitalEntity> join = root2.join(PatientEntity_.Hospital); 
       subquery.where(cb.equal(join.get(HospitalEntity_.id), id)); 


delete.where(root.in(subquery)); 
Query query = entityManager.createQuery(delete); 
query.executeUpdate();