【问题标题】:JpaRepository - delete method - inform that entity does not existJpaRepository - 删除方法 - 通知实体不存在
【发布时间】:2017-04-26 17:44:10
【问题描述】:

删除操作期间,JpaRepository能否通知我,我要删除的实体不存在 ?

我知道删除方法不会返回 boolean 值,也不会抛出 Exceptions

我也知道我可以简单地执行 exists() 或 findOne() 然后执行删除,但我只是好奇。

有什么办法可以强制吗?

我使用的是 Spring Boot 1.5.1。 示例代码如下:

public HttpStatus deleteEventByTitle(String eventTitle) {
    try {
        eventRepository.deleteByTitle(eventTitle);
    } catch (EntityNotFoundException e) { // just showing what I want to do
        return HttpStatus.NOT_FOUND;
    }
    return HttpStatus.OK;
}


public interface EventRepository extends JpaRepository<Event, Long> {

    void deleteByTitle(String title);

}

【问题讨论】:

  • 将 void 更改为 int,从而拥有int deleteByTitle(String title);。这将返回受影响的行。因此,如果您的 return > 0 则删除了某些内容。如果你想要一个额外的方法,比如deleteByTitleOrThrow(String title),那么你可以创建一个 ...Impl 类和一个额外的接口来扩展行为并将该方法添加到它。

标签: java spring spring-data-jpa


【解决方案1】:

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

使用它我们可以将代码更新为:

public interface EventRepository extends JpaRepository<Event, Long> {
    long deleteByTitle(String title);
}

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

public HttpStatus deleteEventByTitle(String eventTitle) {
    long numOfEntriesDeleted = eventRepository.deleteByTitle(eventTitle);
    if(numOfEntriesDeleted != 1){
       return HttpStatus.NOT_FOUND;
    }
    return HttpStatus.OK;
}

【讨论】:

    【解决方案2】:

    根据规范,这是不可能的,我不知道有这样的功能。

    我知道在使用 Cassandra 和 Datastax 时,您可以查看wasApplied()

    唯一的解决方法是实现您自己的deleteOrThrowException-方法并抛出异常以防您找不到实体。

    为了实现这一点,您可以添加一个

    @Query("select count(event)>0 from Event e where eventTitle := eventTitle")
    public boolean existsByTitle(String eventTitle);
    

    【讨论】:

    • 嗯。所以我认为最好的方法是写@Query("..") Boolean existsByTitle,因为Spring Data不支持existsByAttribute。
    • 已更新示例。
    【解决方案3】:

    您可以在删除之前检查它是否存在:

    // Check if the ID is available
    if (deviceRepository.existsById(id)) {
        deviceRepository.deleteById(id);
        //returnObject.setMessage("Deleted successfully !!");
    
    } else {
        //returnObject.setMessage("The ID is not found");
    }
    

    【讨论】:

    • 这在多线程环境中是不安全的,因为在数据库查询和删除另一个查询之间可能已经删除了实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多