繁体   English   中英

Spring JPA 具有可选返回类型的派生删除返回已删除的实体计数而不是已删除的实体

[英]Spring JPA Derived Delete with Optional Return Type returns the deleted entity count instead of the deleted entity

我有一个 Spring 引导应用程序来跟踪书籍。 Book 实体与此类似。

 @Entity @DynamicUpdate @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Builder public class Book implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long bookId; @Column(nullable = false, unique = true) private String bookName; }

它有一个存储库,通过它我可以通过它的bookName属性删除一本书。

 @Repository public interface BookRepository extends JpaRepository<Book, String> { Optional<Book> deleteByBookName(String bookName); }

我的删除方法如下所示。

 @Transactional public void deleteBook(String bookName) { Optional<Book> deletedBook = bookRepository.deleteByBookName(bookName); if (deletedBook.isEmpty()) { throw new ResourceNotFoundException("Book Not Found"); } }

但是,此deleteByBookName方法不是返回Optional<Book>类型的实例,而是返回 Optional 对象,例如Optional[0]Optional[1] ,它们将已删除的书计数作为值。

因此, deletedBook.isEmpty()始终为真,即使删除了 0 本书。

为什么这个deleteByBookName方法在 Optional 中返回已删除的计数,而不是已删除的实体?

Spring 数据不返回删除 object 删除操作后,它只能返回删除的对象 count 或void 你也可以看看 Spring 官方文档

delete…By, remove…By - Delete query method returning either no result (void) or the delete count.

解决方案是检查删除的计数而不是删除的 object。

您应该重构检查已删除计数的方法,如下所示。

@Transactional
public void deleteBook(String bookName) {

  Integer deletedBookCount = bookRepository.deleteByBookName(bookName);
  if (deletedBookCount == null || deletedBookCount == 0) {
      throw new ResourceNotFoundException("Book Not Found");
  }

}

因此,更改 Repository 方法的签名。

@Repository
public interface BookRepository extends JpaRepository<Book, String> {
    Integer deleteByBookName(String bookName);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM