JPA仕様はWHERE句を作成するために強力です。しかし、それはSELECT(findAllメソッドで)に対してのみ定義されているようです。JPA Springデータの削除と更新の指定
DELETEとUPDATEで同じ動作をすることはできますか?したがって、削除または更新する前にスコープの選択を避けることが可能です。
Thxを
JPA仕様はWHERE句を作成するために強力です。しかし、それはSELECT(findAllメソッドで)に対してのみ定義されているようです。JPA Springデータの削除と更新の指定
DELETEとUPDATEで同じ動作をすることはできますか?したがって、削除または更新する前にスコープの選択を避けることが可能です。
Thxを
私はそれは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);
}
opは同様のメソッドを要求します。これは、すべてのクエリを記述しないことを意味します。 – davidxxx
メガデックに感謝します。しかし、すべての可能なクエリを書くのを避けることが目標です。 – OlivierTerrien
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();
解決策を見つけましたか? –
いいえ "find"と "delete"または "save"メソッドを使用する必要があります – OlivierTerrien