2016-11-30 53 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(); 
相關問題