2016-11-30 435 views
2

JPA规范功能强大,用于构建WHERE子句。但是,它似乎只被定义为SELECT(使用findAll方法)。JPA使用Spring Data Specification进行删除和更新

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

THX

+0

您是否找到了解决方案? –

+0

编号我必须使用“查找”,然后“删除”或“保存”方法 – OlivierTerrien

回答

0

我不相信这是目前在JPA,但你有以下几种选择:

你可以使用自定义查询。

例如,在你的资料库:

@Transactional 
@Modifying(clearAutomatically = true) 
@Query(value="delete from entity where id_entity =:id", nativeQuery = true) 
void removeEntity(@Param("id") Long id); 

或者,使用Spring数据JPA,除了查询方式,查询推导计数和删除查询,可用。

public interface UserRepository extends CrudRepository<User, Long> { 

Long deleteByLastname(String lastname); 

List<User> removeByLastname(String lastname); 

} 
+0

该op需要类似的方法。它意味着不写所有的查询。 – davidxxx

+0

谢谢Megadec。但目标是避免编写所有可能的查询。 – OlivierTerrien

0

您可以使用CriteriaUpdate和CriteriaDelete。我从RSQL查询中构建我的规范,但也可以用其他方法完成(请参阅https://www.programcreek.com/java-api-examples/index.php?api=javax.persistence.criteria.CriteriaUpdate)。

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();