web-dev-qa-db-fra.com

Spring data jpa deleteBy requête ne fonctionne pas

J'essaie de créer une requête de méthode deleteBy personnalisée dans mon référentiel . Il semble qu'au lieu de supprimer, hibernate effectue une instruction select. 

public interface ContactRepository extends JpaRepository<Contact, Integer> {

    Integer deleteByEmailAddress(String emailAddress);

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

et voici ce que Hibernate essaie de faire:

Hibernate: sélectionnez contact0_.id comme id1_2_, contact0_.emailAddress comme> emailAdd2_2_, contact0_.name comme nom3_2_ de Contact contact0_ où> contact0_.emailAddress =?

Qu'est-ce que je rate? Dois-je effectuer une configuration spéciale pour que la suppression fonctionne?

13
Alexandru Pirvu

La suppression ne fonctionne-t-elle pas ou ne fonctionne-t-elle pas comme prévu? En règle générale, une entité doit être gérée avant de pouvoir être supprimée. Par conséquent, un fournisseur JPA (veille prolongée dans votre cas) chargera (l'entité que vous voyez) l'entité en premier, puis exécutera la suppression. 

Si vous ne voyez que la requête, mais aucune suppression correspondante, voici quelques possibilités:

  1. il n'y a rien à supprimer, assurez-vous que l'enregistrement est là dans la base de données
  2. la suppression doit faire partie d'une transaction. Je crois que les opérations Spring CRUD de données sont transactionnelles par défaut, sinon assurez-vous que ce qui appelle deleteByEmailAddress est transactionnel

Remarque: vous pouvez éviter la sélection lors de la suppression d'une entité à l'aide d'une requête de modification de suppression, exemple ci-dessous:

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

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.

Spring Data: "supprimer par" est pris en charge?

4
Cristian J. Brito

Essayez de déplacer l'appel de requête de suppression vers une classe de service exclusive:

@FunctionalInterface
public interface DeleteService {

    public int deleteIfExists(Date fechaProceso);

}

et l'implémenter dans DeleteServiceImpl.Java par exemple

0
T21