当前位置: 首页 > article >正文

springboot中使用jdbc查询数据库列表时,会出现数据库null值转换过程,很容易出现的错误

在springboot中使用jdbc查询数据库列表时,会出现数据库null转换的过程,这个过程很容易出现意想不到的错误?

比如:使用场景中的jdbcTemplate要查询某列表

return jdbcTemplate.query(sql.getSql(), sql.getParamter(), new BeanPropertyRowMapper<>(OrderPojo.class));

错误信息:

org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'null' to required type 'double' for property 'jfprice'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [null] to type [@io.swagger.annotations.ApiModelProperty double] for value 'null'; nested exception is java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type
	at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:600)
	at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:617)
	at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:464)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:292)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:260)
	at org.springframework.jdbc.core.BeanPropertyRowMapper.mapRow(BeanPropertyRowMapper.java:297)
	at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
	at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
	at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:697)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:716)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:726)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:776)
	at com.example.demo.repository.TestRepository.querList(TestRepository.java:110)

这个错误提示 Failed to convert from type [null] to type [@io.swagger.annotations.ApiModelProperty double] for value 'null' 是由于 Spring 在查询结果中遇到 null 值时,尝试将其转换为原始类型 double,但原始类型(double)不能接受 null。在 Java 中,原始类型(如 doubleintboolean 等)不能为 null,因此会抛出这个异常。

解决方案

可以通过以下几种方法来解决这个问题:

  1. 使用包装类型
    使用 Double(包装类)代替 double(原始类型)。包装类 Double 可以接受 null 值,而原始类型 double 不可以。

    修改你的模型类,将 double 类型的字段改为 Double 类型。

    例如:

    [我是这个原因,但是我没有去改这个类,而是改了数据库底层的默认值]

    @ApiModelProperty("百分比")
    private Double pct;  // 改为 Double
    

    这样,Spring 就可以处理 null 值并将其设置为 null,而不会抛出 ConversionFailedException

  2. 使用 @JsonInclude 来忽略 null
    如果你想保留 double 类型并处理 null,可以在字段上添加 @JsonInclude(JsonInclude.Include.NON_NULL),这样如果字段的值为 null,它将不会被映射到数据库查询结果中。

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Double pct;  // 使用 Double 类型
    

    然后你可以在查询时处理这些字段为 null

  3. 确保数据库返回值不为 null
    如果是因为数据库中的某些列值为 null,你可以在查询时通过 SQL 或 ORM 层做转换。例如,使用 COALESCE 或类似的函数,将 null 值转换为默认值。

    示例 SQL:

    SELECT COALESCE(pct, 0.0) AS pct FROM your_table
    

    这将确保返回一个默认值 0.0 而不是 null

总结

最推荐的做法是将字段类型从原始类型(double)改为包装类型(Double),因为这能兼容 null 值,同时避免其他潜在的错误。在数据库层面,你也可以确保返回值不为 null,通过默认值处理。


http://www.kler.cn/a/385204.html

相关文章:

  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(1)
  • 在PHP中使用UTF-8编码防止乱码需要注意以下几点‌:
  • Pytorch训练时报nan
  • 动态规划 —— dp 问题-粉刷房子
  • vue实现websocket实时短消息通知
  • 云集电商:如何通过 OceanBase 实现降本 87.5%|OceanBase案例
  • Oracle 第30章:最佳实践与案例研究
  • JVM 由多个模块组成,每个模块负责特定的功能
  • 详解Rust标准库:BTreeMap
  • go 集成gorm 数据库操作
  • npm install慢
  • ORACLE 删除archivelog日志
  • 最佳实践:如何实现函数参数之间的TS类型相依赖和自动推断
  • 基于微信小程序的电子购物系统的设计与实现(lw+演示+源码+运行)
  • Vue动态计算Table表格的高度
  • Spring Security(5.x, 6.x ) RBAC访问控制
  • 深入解析 WinForms MVVM 模式中的事件驱动与数据驱动
  • maven打jar包知识-运行包、依赖包、传递性
  • 解析json导出csv或者直接入库
  • 音频内容理解
  • 爱奇艺大数据多AZ统一调度架构:打破数据孤岛,提升效率
  • 【系统架构设计师】高分论文:论软件的可用性设计
  • 如何快速搭建一个spring boot项目
  • FIPS203 后量子安全ML-KEM(标准简读)
  • .vue文件中定义变量和在引用的.ts文件中定义变量的区别
  • C++模拟真人动态生成鼠标滑动路径