JPA規範功能強大,用於構建WHERE子句。但是,它似乎只被定義爲SELECT(使用findAll方法)。JPA使用Spring Data Specification進行刪除和更新
是否有可能與DELETE和UPDATE具有相同的行爲?因此,在刪除或更新它之前可以避免選擇範圍。
THX
JPA規範功能強大,用於構建WHERE子句。但是,它似乎只被定義爲SELECT(使用findAll方法)。JPA使用Spring Data Specification進行刪除和更新
是否有可能與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);
或者,使用Spring數據JPA,除了查詢方式,查詢推導計數和刪除查詢,可用。
public interface UserRepository extends CrudRepository<User, Long> {
Long deleteByLastname(String lastname);
List<User> removeByLastname(String lastname);
}
該op需要類似的方法。它意味着不寫所有的查詢。 – davidxxx
謝謝Megadec。但目標是避免編寫所有可能的查詢。 – 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();
您是否找到了解決方案? –
編號我必須使用「查找」,然後「刪除」或「保存」方法 – OlivierTerrien