sql查询到了数据但是实体类个别字段为null(映射失败)

文章讨论了在SQL查询返回数据后,实体类中部分字段为null的问题,原因可能是SQL语句中的字段未在实体类中正确映射。解决方法是为这些额外字段添加映射。
参考博客:

sql查询到了数据但是实体类个别字段为null(映射失败)_sql语句查到值,加字段!null没值-优快云博客

问题描述:

1.SQL查询到了数据,在idea调试output控制台窗口打印出SQL语句,字段有值;

2.接收实体对象字段无值;

3.接收实体对象所对应的数据库表无该字段,只在实体类中定义(额外增加的字段);

4.SQL语句:该字段的值来自其他表,SQL语句存在关联查询。

问题原因:

SQL语句的接收对象没有定义该字段的映射,没有与实体类建立映射关系。

解决办法:

增加字段映射

### MyBatis 查询时 Decimal 字段null 映射实体类却为 0 的解决方案 在 MyBatis 中,当数据库中的 `DECIMAL` 字段值为 `NULL` 时,默认情况下会将其映射Java 类型的默认值(例如 `BigDecimal` 对应的默认值为 `0`)。这种行为通常是因为 JDBC 驱动程序或 MyBatis 的类型处理器未正确处理 `NULL` 值。以下是解决此问题的几种方法: #### 方法一:使用自定义类型处理器 可以通过实现自定义类型处理器来处理 `NULL` 值的情况。以下是一个示例代码: ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BigDecimalNullTypeHandler extends BaseTypeHandler<BigDecimal> { @Override public void setNonNullParameter(PreparedStatement ps, int i, BigDecimal parameter, JdbcType jdbcType) throws SQLException { ps.setBigDecimal(i, parameter); } @Override public BigDecimal getNullableResult(ResultSet rs, String columnName) throws SQLException { BigDecimal result = rs.getBigDecimal(columnName); return rs.wasNull() ? null : result; } @Override public BigDecimal getNullableResult(ResultSet rs, int columnIndex) throws SQLException { BigDecimal result = rs.getBigDecimal(columnIndex); return rs.wasNull() ? null : result; } @Override public BigDecimal getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { BigDecimal result = cs.getBigDecimal(columnIndex); return cs.wasNull() ? null : result; } } ``` 将上述类型处理器注册到 MyBatis 配置文件中: ```xml <typeHandlers> <typeHandler handler="com.example.BigDecimalNullTypeHandler" javaType="java.math.BigDecimal"/> </typeHandlers> ``` 通过这种方式,MyBatis 在处理 `DECIMAL` 字段时会调用自定义类型处理器,并正确返回 `NULL` 值[^1]。 #### 方法二:修改实体类字段类型 如果允许实体类字段为 `null`,可以将字段类型从 `BigDecimal` 修改为包装类 `java.lang.Double` 或 `java.lang.Float`。这些包装类支持 `null` 值,而原始类型(如 `double` 或 `float`)则不支持。例如: ```java private Double decimalField; // 使用包装类 Double 而不是 double ``` 这种方法简单易行,但需要注意的是,如果需要高精度计算,建议仍然使用 `BigDecimal`[^2]。 #### 方法三:使用动态 SQL 处理 NULL 值 在查询语句中,可以使用动态 SQL 来处理 `NULL` 值。例如,可以将 `NULL` 值替换为默认值 `0`: ```sql SELECT IF(decimal_column IS NULL, 0, decimal_column) AS decimal_column FROM table_name; ``` 或者在 MyBatisXML 文件中使用 `<if>` 标签: ```xml <select id="selectWithDefault" resultType="com.example.Entity"> SELECT CASE WHEN decimal_column IS NULL THEN 0 ELSE decimal_column END AS decimal_column FROM table_name </select> ``` 这种方法的优点是无需修改实体类或类型处理器,缺点是需要在每个查询中手动处理 `NULL` 值[^3]。 #### 方法四:配置 MyBatis 默认值 在 MyBatis 的 `resultMap` 中,可以为字段指定默认值。例如: ```xml <resultMap id="entityResultMap" type="com.example.Entity"> <result column="decimal_column" property="decimalField" javaType="BigDecimal" jdbcType="NUMERIC"/> </resultMap> <select id="selectEntity" resultMap="entityResultMap"> SELECT * FROM table_name </select> ``` 如果 `decimal_column` 的值为 `NULL`,MyBatis 会自动将其映射为 `null`。确保 `javaType` 和 `jdbcType` 配置正确[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值