2016-11-30 4 views
2

JPA仕様はWHERE句を作成するために強力です。しかし、それはSELECT(findAllメソッドで)に対してのみ定義されているようです。JPA Springデータの削除と更新の指定

DELETEとUPDATEで同じ動作をすることはできますか?したがって、削除または更新する前にスコープの選択を避けることが可能です。

Thxを

+0

解決策を見つけましたか? –

+0

いいえ "find"と "delete"または "save"メソッドを使用する必要があります – OlivierTerrien

答えて

0

私はそれはJPAに存在している信じていないが、あなたは次のオプションがあります。

あなたはカスタムクエリを使用することができます。例えば

は、あなたのリポジトリに:両方カウントし、削除クエリのクエリ導出、

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

あるいは、春のデータJPAを使用する方法を照会するほか、利用可能です。

public interface UserRepository extends CrudRepository<User, Long> { 

Long deleteByLastname(String lastname); 

List<User> removeByLastname(String lastname); 

} 
+0

opは同様のメソッドを要求します。これは、すべてのクエリを記述しないことを意味します。 – davidxxx

+0

メガデックに感謝します。しかし、すべての可能なクエリを書くのを避けることが目標です。 – 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(); 
関連する問題