wake-up-neo.com

Spring Data: "Löschen von" wird unterstützt?

Ich verwende Spring JPA für den Datenbankzugriff. Ich kann Beispiele wie findByName und countByName finden, für die ich keine Methodenimplementierung schreiben muss. Ich hoffe, Beispiele für das Löschen einer Gruppe von Datensätzen basierend auf bestimmten Bedingungen zu finden.

Unterstützt Spring JPA das Löschen von deleteByName? Jeder Zeiger wird geschätzt.

Grüße und Danke.

76
curious1

Veraltete Antwort (Spring Data JPA <= 1.6.x) :

@Modifying-Anmerkung zur Rettung. Sie müssen jedoch Ihr benutzerdefiniertes SQL-Verhalten angeben.

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

Update:

In modernen Versionen von Spring Data JPA (> = 1.7.x) kann auf die Abfrageableitung für delete, remove und count zugegriffen werden.

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    @Transactional
    Long deleteByFirstName(String firstName);

    @Transactional
    List<User> removeByFirstName(String firstName);

}
160
Andrey Atapin

Die Ableitung von Löschabfragen unter Verwendung des angegebenen Methodennamens wird ab Version 1.6.0.RC1 von Spring Data JPA unterstützt. Die Schlüsselwörter remove und delete werden unterstützt. Als Rückgabewert kann man zwischen der Anzahl oder einer Liste der entfernten Entitäten wählen.

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);
55

Wenn Sie sich den Quellcode von Spring Data JPA und insbesondere die Klasse PartTreeJpaQuery ansehen, werden Sie feststellen, dass versucht wird, PartTree zu instanziieren. Innerhalb dieser Klasse der folgende reguläre Ausdruck

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

sollte angeben, was erlaubt ist und was nicht.

Wenn Sie versuchen, eine solche Methode hinzuzufügen, werden Sie natürlich feststellen, dass dies nicht funktioniert, und Sie erhalten den vollständigen Stacktrace.

Ich sollte beachten, dass ich die Version 1.5.0.RELEASE von Spring Data JPA

6
geoand

Seien Sie vorsichtig, wenn Sie die abgeleitete Abfrage für das Stapellöschverfahren verwenden .. __ Dies ist nicht das, was Sie erwarten: Delete Execution

0
Andrey Ofim

Wenn Sie vordefinierte Löschmethoden verwenden, die direkt von Spring JPA bereitgestellt werden, werden im Folgenden zwei Abfragen vom Framework ausgeführt.

  • Erfassen Sie zunächst Daten (wie id und andere Spalte) mit select select query mit delete query where-Klausel.

  • nach dem Abrufen des Ergebnissatzes der ersten Abfrage werden die zweiten Löschabfragen für alle IDs (eine nach der anderen) ausgeführt.

    Hinweis: Dies ist keine optimierte Methode für Ihre Anwendung, da viele Abfragen für eine einzelne MYSQL-Löschabfrage ausgeführt werden.

Dies ist eine weitere optimierte Methode zum Löschen von Abfragecode, da nur eine Löschabfrage mit den unten angegebenen angepassten Methoden ausgeführt wird.



@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);
}

0
Suneet Khurana