首页 > 解决方案 > 如何使用 springboot JPA 更新 API 仅更新实体中的特定字段

问题描述

这是我的代码。

实体类:

@Entity
public class Book
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long bookId;
    private double bookPrice;
    private String bookTitle;
    private String bookAuthor;
    private String bookLanguage;
    private LocalDate publicationDate;
    private String publisher;
    private byte[] bookImage;
    private long isbn;
    private int bookQuantity;

控制器类:

@PutMapping("/updatebooks")
    public ResponseEntity<ApiResponse> updateBook(@RequestBody BookDto bookDto)
            throws DataNotFoundException
    {
        return ResponseEntity.ok(bookService.updateBook(bookDto));
    }

服务等级:

@Override
    public ApiResponse updateBook(BookDto bookDto) throws DataNotFoundException
    {
        Book book = bookRepository.findById(bookDto.getBookId())
                .orElseThrow(() -> new DataNotFoundException("Book not found"));
            book.setBookAuthor(bookDto.getBookAuthor());
            book.setBookLanguage(bookDto.getBookLanguage());
            book.setBookPrice(bookDto.getBookPrice());
            book.setBookTitle(bookDto.getBookTitle());
            book.setIsbn(bookDto.getIsbn());
            book.setPublicationDate(bookDto.getPublicationDate());
            book.setPublisher(bookDto.getPublisher());
            bookRepository.save(book);
            return new ApiResponse(HttpStatus.OK.value(), "Updation successful");
    }

所以通过邮递员我只想单独更新 bookAuthor 字段,其他字段必须与数据库中的字段相同。但是当我只更新一个字段时,其他字段会自动分配为 null,我只想更新一个字段。

邮递员截图

在这里看到我只是更新 bookAuthor 字段,但其他人只是更改为 null。那么我怎样才能只更新特定字段并显示其他字段,就像它在数据库中一样。

预更新数据库: 预更新数据库

发布更新数据库: 发布更新数据库:

标签: javamysqlspring-bootapispring-data-jpa

解决方案


@Modifying
@Query(nativeQuery = true, value = "update book set book_author = :bookAuthor where id = :bookId")
int updateBookAuthor(@Param("bookAuthor") String bookAuthor, @Param("bookId") Long bookId);

您可以在 BookRepository 中执行类似的操作,然后从服务类调用...

bookRepository.updateBookAuthor(bookAuthor, bookId)

或修改您的服务类方法,如下所示...

    @Override
    public ApiResponse updateBook(BookDto bookDto) throws DataNotFoundException
    {
        Book book = bookRepository.findById(bookDto.getBookId())
                .orElseThrow(() -> new DataNotFoundException("Book not found"));
        book.setBookAuthor(bookDto.getBookAuthor());
        bookRepository.save(book);
        return new ApiResponse(HttpStatus.OK.value(), "Updation successful");
    }

推荐阅读