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

lawou6xi  于 2022-12-04  发布在  Spring
关注(0)|答案(2)|浏览(142)

我有一个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中的已删除计数,而不是已删除实体?

m0rkklqb

m0rkklqb1#

解决方案是检查已删除的计数,而不是已删除的对象。
您应该重构该方法以检查删除的计数,如下所示。

@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);
}
dwbf0jvd

dwbf0jvd2#

Spring Data不会在删除操作后返回被删除的对象,它只能返回被删除对象的计数或void。你也可以在Spring官方文档中查看。

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

相关问题