You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular+SpringBoot借书功能报错:Cannot cast Integer to String

错误原因及解决方案

原因分析

Repository方法borrowBook声明返回String类型,但SQL语句中RETURNING id返回的是Integer类型的图书ID,Spring Data JPA会直接尝试将查询结果强转为方法声明的返回类型,从而触发ClassCastException。

解决方案

方案1:匹配返回类型与SQL结果类型

将Repository方法的返回类型改为Integer,同步调整业务层代码以适配该类型:

// Repository修改
@Query(value = "UPDATE book SET borrow_status = 1, borrower_id = ?2 WHERE id = ?1 RETURNING id", nativeQuery = true)
Integer borrowBook(Integer bookId, Integer userId);

// 业务层修改
public String borrowBook(Integer bookId) {
    Integer borrowedId = bookRepository.borrowBook(bookId, getCurrentLoginUserId());
    return borrowedId != null ? "图书ID:" + borrowedId + " 借阅成功" : "借阅失败,图书不存在或已被借出";
}

方案2:修改SQL返回字符串类型结果

如果业务必须要求Repository返回String,可在SQL中将ID转换为字符串类型,不同数据库语法如下:

  • PostgreSQL:
@Query(value = "UPDATE book SET borrow_status = 1, borrower_id = ?2 WHERE id = ?1 RETURNING CAST(id AS VARCHAR)", nativeQuery = true)
String borrowBook(Integer bookId, Integer userId);
  • MySQL:
@Query(value = "UPDATE book SET borrow_status = 1, borrower_id = ?2 WHERE id = ?1 RETURNING CONVERT(id, CHAR)", nativeQuery = true)
String borrowBook(Integer bookId, Integer userId);

额外优化建议

  1. 在SQL的UPDATE语句中增加借阅状态判断AND borrow_status = 0,避免重复借阅:
UPDATE book SET borrow_status = 1, borrower_id = ?2 WHERE id = ?1 AND borrow_status = 0 RETURNING id
  1. 控制器中建议使用DTO接收参数,避免直接使用Map进行类型转换,降低出错风险:
public class BorrowRequest {
    private Integer bookId;
    // getter、setter
}

// 控制器修改
@PostMapping("/borrow")
public ResponseEntity<String> borrowBook(@RequestBody BorrowRequest request) {
    String result = bookService.borrowBook(request.getBookId());
    return ResponseEntity.ok(result);
}

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:42:01