[英]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.