Spring Data: «supprimer par» est pris en charge?

J’utilise le Spring JPA pour accéder à la firebase database. Je suis capable de 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 deleteByName-like delete? 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 fournir votre comportement SQL personnalisé.

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

Mettre à jour:

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

 public interface UserRepository extends CrudRepository { Long countByFirstName(Ssortingng firstName); @Transactional Long deleteByFirstName(Ssortingng firstName); @Transactional List removeByFirstName(Ssortingng firstName); } 

La dérivation des requêtes de suppression à l’aide du 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 numéro ou une liste d’entités supprimées.

 Long removeByLastname(Ssortingng lastname); List deleteByLastname(Ssortingng lastname); 

Si vous regardez le code source de Spring Data JPA, et en particulier la classe PartTreeJpaQuery , vous verrez qu’il essaye d’instancier PartTree . Dans cette classe l’expression régulière suivante

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

devrait indiquer ce qui est permis et ce qui ne l’est pas.

Bien sûr, si vous essayez d’append une telle méthode, vous verrez qu’elle ne fonctionne pas et que vous obtenez la stack complète.

Je dois noter que j’utilisais la version 1.5.0.RELEASE de Spring Data JPA

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

  • Collectez d’abord les données (comme les identifiants et les autres colonnes) en utilisant par exemple une requête select avec une clause delete query where.

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

    Remarque: Cette méthode n’est pas optimisée pour votre application car de nombreuses requêtes seront exécutées pour une seule requête de suppression MYSQL.

Ceci est un autre moyen optimisé pour supprimer le code de requête car une seule requête de suppression s’exécutera en utilisant les 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(Ssortingng startDate, Ssortingng endDate); }