我有一些代码可以从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中执行此操作。
当我第二次尝试删除配方时,我仍然收到“成功删除食谱”的消息。
答案 0 :(得分:0)
答案 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)开始,我们可以使用派生的delete
或remove
查询。它返回删除的实体数或删除的所有实体。
使用它,您可以将代码更新为:
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";
}