webentwicklung-frage-antwort-db.com.de

Spring-Daten jpa deleteBy-Abfrage funktioniert nicht

Ich versuche, eine benutzerdefinierte deleteBy-Methodenabfrage in meinem Repository zu erstellen ..__ Anscheinend gibt der Hibernate anstelle des Löschens eine select-Anweisung aus. 

public interface ContactRepository extends JpaRepository<Contact, Integer> {

    Integer deleteByEmailAddress(String emailAddress);

    //and this one works
    Contact findContactByName(String name);
}

und Folgendes versucht Hibernate zu tun:

Ruhezustand: Wählen Sie contact0_.id als id1_2_, contact0_.emailAddress als> emailAdd2_2_, contact0_.name als name3_2_ aus Kontakt contact0_ wobei> contact0_.emailAddress =?

Was vermisse ich? Muss ich eine spezielle Konfiguration vornehmen, damit das Löschen funktioniert?

13
Alexandru Pirvu

Funktioniert das Löschen nicht oder nicht wie erwartet? Normalerweise muss eine Entität verwaltet werden, bevor sie gelöscht werden kann. Daher lädt ein JPA-Anbieter (in Ihrem Fall der Ruhezustand) die Entität zuerst (die angezeigte Abfrage) und gibt dann den Löschvorgang aus. 

Wenn Sie nur die Abfrage sehen, jedoch kein entsprechendes Löschen, gibt es folgende Möglichkeiten:

  1. es ist nichts zu löschen. Stellen Sie sicher, dass der Datensatz in der Datenbank vorhanden ist
  2. das Löschen muss Teil einer Transaktion sein. Ich glaube, die CRUD-Operationen von Spring data sind standardmäßig transaktional, wenn nicht einfach sichergestellt ist, dass das, was deleteByEmailAddress aufruft, transaktional ist

Hinweis: Sie können die Auswahl beim Entfernen einer Entität mithilfe eines Löschvorgangs zum Löschen einer Abfrage vermeiden. Beispiel:

// NOTE: you have return void
@Modifying
@Transactional
@Query(value="delete from Contact c where c.emailAddress = ?1")
void deleteByEmailAddress(String emailAddress)
28
ikumen

In modernen Spring Data-Versionen von JPA (> = 1.7.x) kann auf die Ableitung von Lösch-, Entfernungs- und Zählvorgängen zugegriffen werden.

Spring Data: "delete by" wird unterstützt?

4

Versuchen Sie, den Aufruf der Löschabfrage in eine dafür exklusive Serviceklasse zu verschieben:

@FunctionalInterface
public interface DeleteService {

    public int deleteIfExists(Date fechaProceso);

}

und implementieren Sie es zum Beispiel in DeleteServiceImpl.Java

0
T21