我有一个Sping Boot 应用程序来跟踪图书。图书实体与此类似。
@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);
}
我的delete方法如下所示。
@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[0]
、Optional[1]
,这些对象的值为已删除图书计数。
因此,deletedBook.isEmpty()
始终为真,即使删除了0本书。
为什么deleteByBookName
方法返回Optional中的已删除计数,而不是已删除实体?
2条答案
按热度按时间m0rkklqb1#
解决方案是检查已删除的计数,而不是已删除的对象。
您应该重构该方法以检查删除的计数,如下所示。
相应地,更改Repository方法的签名。
dwbf0jvd2#
Spring Data不会在删除操作后返回被删除的对象,它只能返回被删除对象的计数或
void
。你也可以在Spring官方文档中查看。