在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,通过默认值处理。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐