如何在Java Spring数据库查询中检查成功/失败?

时间:2019-04-08 06:14:23

标签: java spring mongodb sql-delete

我有一些代码可以从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();
    }
}

这能够成功删除基于ID的配方。但是,我不确定如何捕获这种情况,例如该食谱甚至不存在或删除失败。

使用JavaScript / Node,这真的很容易,因为我可以根据结果/错误是否为null传递回调函数,从而确定查询是否成功并继续。我很迷失如何在Java / Spring中执行此操作。

当我第二次尝试删除配方时,我仍然收到“成功删除食谱”的消息。

6 个答案:

答案 0 :(得分:0)

您可以在使用existsById

之前添加支票
boolean isFound = repository.existsById(recipeId);
  

返回具有给定id的实体是否存在。

答案 1 :(得分:0)

尝试像这样向存储库界面添加新方法

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

希望有帮助

答案 2 :(得分:0)

如果您检查JPARepository接口,将会得到

/**
     * 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);

根据您的要求,如果给定的ID在数据库中不存在,它将不会引发任何异常。

为此,您可以使用boolean isFound = repository.existsById(recipeId);,如果isFound为true,则可以将其删除。如果isFound为假,则可以引发异常。

第二种方法是可以检查

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

此类包含deleteById方法。如果数据库中不存在id,则此方法将引发异常。

/*
     * (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)));
    }

答案 3 :(得分:0)

据报它是Spring的一个错误(仍在打开中):https://jira.spring.io/browse/DATAMONGO-1997?jql=text%20~%20%22deleteById%22

检查它是否存在对我们来说不是解决方案,因为它对比赛条件很敏感。我们发现最好和更有效的解决方法是@SandOfTime建议:在您的MongoRepository界面中添加:

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

答案 4 :(得分:0)

我也有类似的要求,但情况略有不同。首先,请告诉我我的要求,如果用户名不存在,则需要添加一个用户。因此,在存储库中,有一个内置方法可以找到用户名。

/:domain

因此,在Controller层中,我实现了以下内容。

Usermodel findByUsername(String username);

我认为您的情况也可以适用。需要检查recipeId,然后您才能执行删除操作。

答案 5 :(得分:0)

从Spring Data JPA(> = 1.7.x)开始,我们可以使用派生的deleteremove查询。它返回删除的实体数或删除的所有实体。

使用它,您可以将代码更新为:

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

如果该实体不存在,我们可以抛出异常。

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