Java JPA使用Spring数据规范进行删除和更新

Java JPA使用Spring数据规范进行删除和更新,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,为了构建WHERE子句,JPA规范非常强大。但是,它似乎只为SELECT定义(使用findAll方法) 删除和更新是否可能有相同的行为?因此,可以避免在删除或更新范围之前选择范围 Thx您可以使用CriteriaUpdate和CriteriaDelete。我在这里从一个RSQL查询构建我的规范,但是它也可以通过许多其他方式来完成(请参阅) Node rootNode=new RSQLParser(CustomRsqlOperators.getOperators()).parse(filter);

为了构建WHERE子句,JPA规范非常强大。但是,它似乎只为SELECT定义(使用findAll方法)

删除和更新是否可能有相同的行为?因此,可以避免在删除或更新范围之前选择范围


Thx

您可以使用CriteriaUpdate和CriteriaDelete。我在这里从一个RSQL查询构建我的规范,但是它也可以通过许多其他方式来完成(请参阅)

Node rootNode=new RSQLParser(CustomRsqlOperators.getOperators()).parse(filter);
Specification spec=rootNode.accept(新CustomRsqlVisitor());
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaUpdate=builder.createCriteriaUpdate(凭证.class);
Root=update.from(凭证类);
谓词条件=spec.toPredicate(root,builder.createQuery(),builder);
更新。何处(条件);
if(voucherUpdate.getIsUsed()!=null){
update.set(“isUsed”,voucherUpdate.getIsUsed());
}
Query q=entityManager.createQuery(更新);
int updated=q.executeUpdate();
entityManager.flush();

您找到解决方案了吗?没有。我必须先使用“查找”,然后使用“删除”或“保存”方法
Node rootNode = new RSQLParser(CustomRsqlOperators.getOperators()).parse(filter);
Specification<Voucher> spec = rootNode.accept(new CustomRsqlVisitor<Voucher>());

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaUpdate<Voucher> update = builder.createCriteriaUpdate(Voucher.class);

Root<Voucher> root = update.from(Voucher.class);

Predicate condition = spec.toPredicate(root, builder.createQuery(), builder);
update.where(condition);

if (voucherUpdate.getIsUsed() != null) {
    update.set("isUsed", voucherUpdate.getIsUsed());
}

Query q = entityManager.createQuery(update);
int updated = q.executeUpdate();

entityManager.flush();