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