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);
额外优化建议
- 在SQL的UPDATE语句中增加借阅状态判断
AND borrow_status = 0,避免重复借阅:
UPDATE book SET borrow_status = 1, borrower_id = ?2 WHERE id = ?1 AND borrow_status = 0 RETURNING id
- 控制器中建议使用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
相关产品推荐
相关产品推荐

