Spring Data: "silme" destekleniyor mu?


101

Veritabanı erişimi için Spring JPA kullanıyorum. Herhangi bir yöntem uygulaması yazmak zorunda olmadığım findByName ve countByName gibi örnekler bulabiliyorum. Bazı koşullara göre bir grup kaydı silmek için örnekler bulmayı umuyorum.

Spring JPA, deleteByName benzeri silmeyi destekliyor mu? Herhangi bir işaretçi takdir edilmektedir.

Saygı ve teşekkürler.

Yanıtlar:


187

Kullanımdan kaldırılmış yanıt (Bahar Verileri JPA <= 1.6.x) :

@Modifyingkurtarmaya açıklama. Yine de özel SQL davranışınızı sağlamanız gerekecektir.

public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @Query("delete from User u where u.firstName = ?1")
    void deleteUsersByFirstName(String firstName);
}

Güncelleme:

Modern Bahar Veri JPA (> = 1.7.x) için sorgu türetme sürümlerinde delete, removeve countoperasyonlar erişilebilir.

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    Long deleteByFirstName(String firstName);

    List<User> removeByFirstName(String firstName);

}

2
@AndreyAtapin Artık iyi bir yanıt olmadığı için olumsuz oy verin. Belki siler? Yığın taşma kusurlarından biri, söz konusu kitaplıklarla ilişkili sürüm değişikliklerini / hata düzeltmelerini ele almaktır.
Ben George

1
@webgeek, bu sorunu çözüyordum DELETE FROM x WHERE id = ?1 or parent_id = ?1. Btw, bir tür girmediğinizden emin olun parent__id(niyetinize göre çift kısa çizgi var mı?). Yine de neden yerel bir sorgu seçeneği kullanıyorsunuz?
Andrey Atapin

4
1.7.4 kullansam bile, başarılı bir silme işlemi için sorgu yönteminin yukarısında @Transactional ek açıklama gereklidir
gokhansari

40
Tipik olarak, bir uygulamada, @ Service sınıflarına / yöntemlerine sahip olursunuz ve bunlar Depoları çağırır. Ve @ Service public yöntemleri, @ Transactional olarak işaretlenen yöntemler olmalıdır, çünkü işlemler Use Case tabanlıdır. Kullanım senaryosunun tamamen tamamlanması veya geri alınması gerektiği anlamına gelir. Her bir Veri Havuzu yöntemi değil. Bu yüzden LÜTFEN Depo yöntemlerinde @ İşlemi KULLANMAYIN. Ancak depoyu kullanan Hizmet yöntemlerinde.
user1567291

1
Repo'da @Transactional yapmak, repo'yu birden çok kez çağırırsanız, her biri farklı işlemlere sahip olacak, yani 1 sorgu içinde geri alınacak şekilde hizmet içi anlamına gelir. Hizmet düzeyinde sağlarsanız, tüm işleviniz herhangi bir hata durumunda geri alınacaktır.
P Satish Patro

79

Verilen yöntem adı kullanılarak silme sorgularının türetilmesi , Spring Data JPA'nın 1.6.0.RC1 sürümünden itibaren desteklenmektedir . Anahtar kelimeler removeve deletedesteklenmektedir. Dönüş değeri olarak sayı veya kaldırılan varlıkların listesi arasında seçim yapılabilir.

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);

7

Spring Data JPA'nın kaynak koduna ve özellikle PartTreeJpaQuerysınıfa bakarsanız, bunun somutlaştırmaya çalışıldığını göreceksiniz PartTree. Bu sınıfın içinde aşağıdaki normal ifade

private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")

neye izin verildiğini ve neyin verilmediğini belirtmelidir.

Elbette böyle bir yöntem eklemeye çalışırsanız, aslında bunun işe yaramadığını göreceksiniz ve tam yığın izini elde edeceksiniz.

1.5.0.RELEASESpring Data JPA sürümüne bakarak kullandığımı not etmeliyim


6

2 yol:-

Birinci Özel Sorgu

@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);

Yönteme göre 2. bir JPA Sorgusu

List<User> deleteByLastname(String lastname);

Yönteme göre sorgulama yaptığınızda (2. yol), önce bir alma çağrısı yapacak

select * from user where last_name = :firstName

Sonra bir Listeye yükleyecek ve ardından tek tek silme kimliğini arayacaktır.

delete from user where id = 18
delete from user where id = 19

Önce nesnenin listesini getir, sonra döngü için kimliği birer birer sil

Ancak 1. seçenek (özel sorgu),

Bu sadece tek bir sorgu. Değerin olduğu her yerde silinecek.

Bu bağlantıya da gidin https://www.baeldung.com/spring-data-jpa-deleteby


1
Bilgi için teşekkürler!
curious1

2

Doğrudan Spring JPA tarafından sağlanan önceden tanımlanmış silme yöntemlerini kullanacaksanız, çerçeve tarafından aşağıdaki iki sorgu yürütülecektir.

  • İlk olarak, delete sorgusu where cümlesi ile seçme sorgusunu çalıştırarak verileri (id ve diğer sütun gibi) toplayın.

  • sonra ilk sorgunun resultSet'ini aldıktan sonra, tüm id için ikinci silme sorguları çalıştırılacak (tek tek)

    Not: Bu, uygulamanız için optimize edilmiş bir yöntem değildir çünkü birçok sorgu tek MYSQL silme sorgusu için yürütülecektir.

Bu, sorgu kodunu silmek için en iyi duruma getirilmiş başka bir yoldur, çünkü aşağıdaki özelleştirilmiş yöntemler kullanılarak yalnızca bir silme sorgusu yürütülür.



@NamedNativeQueries({

@NamedNativeQuery(name = "Abc.deleteByCreatedTimeBetween",
            query = "DELETE FROM abc WHERE create_time BETWEEN ?1 AND ?2")
    ,

    @NamedNativeQuery(name = "Abc.getByMaxId",
            query = "SELECT max(id) from abc")
})

@Entity
public class Abc implements Serializable {

}

@Repository
public interface AbcRepository extends CrudRepository {

    int getByMaxId();

    @Transactional
    @Modifying
    void deleteByCreatedTimeBetween(String startDate, String endDate);
}

1

Toplu silme için türetilmiş sorgu kullandığınızda dikkatli olun. Beklediğiniz gibi değil: DeleteExecution


Selam. RBAR'ı işaret ediyorsanız (sırayı acı çekerek satır), cevabınıza bunu ekleyebilir misiniz? (ve ben oy vereceğim). Burada neye işaret ettiğinizi tahmin ediyorum.
granadaCoder

0

Evet, deleteBy yöntemi desteklenmektedir Kullanmak için yöntemi @Transactional ile açıklamanız gerekir.


0

burada benim 2 sentimi takip ediyor. Aşağıdakiler gibi yerel sorgular da kullanabilirsiniz:

@Modifying
@Query(value="delete from rreo r where r.cod_ibge = ?1 and r.exercicio= ?2", nativeQuery = true)
void deleteByParameters(Integer codIbge, Integer exercicio);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.