web-dev-qa-db-fra.com

Données de printemps: "supprimer par" est pris en charge?

J'utilise Spring JPA pour l'accès à la base de données. Je peux trouver des exemples tels que findByName et countByName, pour lesquels je n'ai pas à écrire d'implémentation de méthode. J'espère trouver des exemples pour supprimer un groupe d'enregistrements en fonction de certaines conditions.

Spring JPA prend-il en charge la suppression similaire à deleteByName? Tout pointeur est apprécié.

Cordialement et merci.

76
curious1

Réponse obsolète (Spring Data JPA <= 1.6.x) :

@Modifying annotation à la rescousse. Vous devrez cependant indiquer votre comportement SQL personnalisé.

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

Mettre à jour:

Dans les versions modernes de Spring Data JPA (> = 1.7.x), la dérivation de la requête pour les opérations delete, remove et count est accessible.

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

La dérivation des requêtes de suppression utilisant un nom de méthode donné est prise en charge à partir de la version 1.6.0.RC1 de Spring Data JPA. Les mots clés remove et delete sont pris en charge. En tant que valeur de retour, vous pouvez choisir entre le nombre ou une liste d'entités supprimées.

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);
55
Christoph Strobl

Soyez prudent lorsque vous utilisez une requête dérivée pour la suppression par lots . Ce n'est pas ce à quoi vous vous attendiez: Delete Execution

0
Andrey Ofim

Si vous souhaitez utiliser des méthodes de suppression prédéfinies directement fournies par Spring JPA, deux requêtes ci-dessous seront exécutées par le framework.

  • Commencez par collecter des données (comme id et une autre colonne) en utilisant par exécuter une requête select avec une requête delete clause where.

  • ensuite, après avoir obtenu le résultat de la première requête, les secondes requêtes de suppression seront exécutées pour tous les identifiants (un par un)

    Remarque: Ce n'est pas une manière optimisée pour votre application car de nombreuses requêtes seront exécutées pour une requête de suppression MYSQL unique.

C'est un autre moyen optimisé de supprimer le code de requête car une seule requête de suppression s'exécutera à l'aide des méthodes personnalisées ci-dessous.



@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