2
votes

Comment vérifier le succès / l'échec des requêtes de base de données Java Spring?

J'ai du code pour supprimer une recette de ma base de données mongoDB:

@RequestMapping(value = "/recipe/{id}", method = RequestMethod.DELETE)
public String deleteSingleRecipe(@PathVariable("id") String recipeId) {
    try {
        repository.deleteById(recipeId);
        return "Deleted RECIPE success";
    } catch (Exception ex) {
        return ex.toString();
    }
}

Ceci est capable de supprimer avec succès une recette basée sur l'ID. Cependant, je ne sais pas comment attraper des cas tels que si la recette n'existe même pas ou si la suppression échoue.

Avec JavaScript / Node, c'était vraiment facile car je pouvais passer une fonction de rappel avec selon si résultat / erreur était nul, je pourrais déterminer le succès de la requête et continuer. Je ne sais pas trop comment faire cela dans Java / Spring.

Lorsque j'ai essayé de supprimer une recette une deuxième fois, j'ai toujours eu le message "Succès de la recette supprimée".


0 commentaires

6 Réponses :


-1
votes

Vous pouvez ajouter une vérification avant d'utiliser existsById

boolean isFound = repository.existsById(recipeId);

Renvoie si une entité avec l'ID donné existe.


5 commentaires

Je suppose que cela est acceptable, mais nécessite également une lecture supplémentaire de la base de données. De plus, je cherchais davantage une solution «généralisée» au lieu de simplement résoudre mon problème. Par exemple, que faire si j'ajoute un nouvel élément à la base de données? Est-ce que le seul moyen de vérifier s'il a réussi est vraiment de faire une vérification par la suite pour voir s'il existe dans la base de données? (Également à ce stade, comment puis-je obtenir l'ID pour vérifier cet objet dans la base de données?) Le manque de valeurs de retour ou de données est frustrant.


@Birdman si vous utilisez jdbcTemplate , il renverra le nombre de lignes mises à jour, voir docs.spring.io/spring/docs/current/javadoc-api/org/… < / a> voir aussi stackoverflow.com/questions/36021525/...


Eh bien dans ce cas, ce n'est pas jdbcTemplate mais MongoTemplate supprimera les méthodes qui retournent un DeleteResult


Comme @JEY l'a suggéré, il existe également des méthodes de suppression de MongoTemplate comme docs.spring.io/spring-data/mongodb / docs / current / api / org /…


Cela a été utile pour répondre à mon commentaire: comme le MongoRepsitory implémente CredRepository, il y avait ici des informations sur save (): baeldung.com/spring-data-crud-repository-save "La méthode save () renvoie l'entité enregistrée, y compris le champ id mis à jour."



0
votes

Essayez d'ajouter une nouvelle méthode à l'interface du référentiel comme celle-ci

@Modifying
@Query("DELETE FROM MY_TABLE WHERE ID = ?1")
default boolean deleteById(IdPrimitiveType id){
  return true;
 }

J'espère que cela aidera


0 commentaires

1
votes

Si vous vérifiez l'interface du référentiel JPAR, vous obtiendrez

/*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#delete(java.io.Serializable)
     */
    @Transactional
    public void deleteById(ID id) {

        Assert.notNull(id, ID_MUST_NOT_BE_NULL);

        delete(findById(id).orElseThrow(() -> new EmptyResultDataAccessException(
                String.format("No %s entity with id %s exists!", entityInformation.getJavaType(), id), 1)));
    }

de sorte que, selon vos besoins, il ne lèvera aucune exception si l'ID donné n'existe pas dans DB.

pour cela, vous pouvez utiliser boolean isFound = repository.existsById (recetteId); et si isFound est vrai, vous pouvez le supprimer. et si isFound est faux, vous pouvez lancer une exception.

la deuxième façon est de vérifier

  public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T>

cette classe contient méthode deleteById . et cette méthode lèvera une exception si id n'existe pas dans DB.

/**
     * Deletes the entity with the given id.
     * 
     * @param id must not be {@literal null}.
     * @throws IllegalArgumentException in case the given {@code id} is {@literal null}
     */
    void deleteById(ID id);

/**
     * Deletes a given entity.
     * 
     * @param entity
     * @throws IllegalArgumentException in case the given entity is {@literal null}.
     */
    void delete(T entity);


0 commentaires

0
votes

Il a été signalé à Spring comme un bogue (qui est toujours ouvert): https://jira.spring.io/browse/DATAMONGO-1997?jql=text%20~%20%22deleteById%22

Vérification de son existence avant ou après n'était pas une solution pour nous car il est sensible à la condition de race. La solution de contournement la meilleure et la plus efficace que nous ayons trouvée était ce que @SandOfTime a suggéré: dans votre interface MongoRepository, ajoutez:

@DeleteQuery("{_id:?0}")
Long deleteByIdReturningDeletedCount(String id);


0 commentaires

0
votes

J'avais également un type d'exigence similaire, mais mon cas est légèrement différent. Je vais d'abord dire à mes besoins que je dois ajouter un utilisateur si le nom d'utilisateur n'existe pas. Donc, dans le référentiel, il existe une méthode intégrée pour trouver le nom d'utilisateur.

public String signUp(@RequestBody Usermodel user) {
        if(userRepository.findByUsername(user.getUsername())==null) {
            userRepository.save(user);
            return "Success";
        }
        else{
            return "Username Already Exsist";
        }
    }

Donc, dans la couche Controller, j'ai implémenté ce qui suit.

Usermodel findByUsername(String username);

Je pense que cela peut également s'appliquer à votre cas. Vous devez vérifier l’identifiant de recette et vous pourrez ensuite effectuer une suppression.


0 commentaires

0
votes

À partir de Spring Data JPA (> = 1.7.x), nous pouvons utiliser la requête dérivée delete ou remove . Il renvoie le nombre d'entités supprimées ou ce que toutes les entités sont supprimées.

En l'utilisant, vous pouvez mettre à jour votre code comme:

@RequestMapping(value = "/recipe/{id}", method = RequestMethod.DELETE)
public String deleteSingleRecipe(@PathVariable("id") String recipeId) {
    long numberOfRecipiesDeleted;
    try {
        numberOfRecipiesDeleted = repository.deleteById(recipeId);
    } catch (DataAccessException ex) {
        return ex.toString();
    }
    if(numberOfRecipiesDeleted == 0){
      throw new ReciepeNotFoundException();
    }
    return "Deleted RECIPE success";
}

et nous pouvons lever une exception si l'entité n'existe pas.

public interface RecipetRepository extends CrudRepository<Reciepe, Long> {
    long deleteById(String id);
}


0 commentaires