MyBatis数据库查询报错:Cannot invoke Object.hashCode(),key为null
问题分析与解决方案
这个Cannot invoke "Object.hashCode()" because "key" is null错误是MyBatis处理查询结果时,尝试将null值作为HashMap的key导致的——Java的HashMap不允许key为null,调用其hashCode方法必然抛出空指针异常。结合报错栈和你的配置,触发场景及解决方法如下:
可能的触发场景
1. Mapper接口方法使用了@MapKey注解
如果你的getRotnAndLegs方法定义类似:
@MapKey("rots_id") Map<String, SubmitPojo> getRotnAndLegs(...);
而SQL返回ROTATION_ID为NULL,MyBatis会将rots_id(对应ROTATION_ID)作为Map的key,null值直接触发该异常。
2. ResultMap中存在嵌套关联/集合映射,且关联字段为NULL
如果你的rotsMap中定义了嵌套的<association>或<collection>标签,且column属性指定了ROTATION_ID(比如关联查询子表数据):
<resultMap id="rotsMap" type="SubmitPojo"> <!-- 现有字段映射 --> <collection property="legs" column="ROTATION_ID" select="getLegsByRotId"/> </resultMap>
当ROTATION_ID为NULL时,MyBatis传递关联查询参数时会将null作为key,触发hashCode调用异常。
对应解决方案
针对场景1:修改@MapKey配置或返回类型
- 更换
@MapKey指定的字段为SQL中不会返回NULL的字段,比如你的SBMT_ID:@MapKey("sbmt_id") Map<String, SubmitPojo> getRotnAndLegs(...); - 若不需要Map格式返回,直接改用
List<SubmitPojo>作为方法返回类型,避免依赖key字段。
针对场景2:处理关联字段的NULL值
- 在SQL中为可能为NULL的关联字段设置默认值,确保不会返回NULL:
SELECT COALESCE(NULL, 0) AS ROTATION_ID, -- 用0或其他占位值替代NULL NULL AS ARRIVAL_TIME, OP.SBMT_ID AS SBMT_ID FROM ROTATION OP; - 若该关联字段为NULL时不需要执行嵌套查询,可在
column中添加判断:<collection property="legs" column="{rotId=ROTATION_ID}" select="getLegsByRotId" where="rotId is not null"/>
验证步骤
- 检查
SubmitMapperlfc接口中getRotnAndLegs方法的返回类型和注解配置; - 核对
SbmtMapper.xml中rotsMap的完整配置,确认是否存在嵌套映射; - 临时修改SQL,将
ROTATION_ID替换为非NULL值(比如1),测试是否仍报错,快速验证问题根源。
内容的提问来源于stack exchange,提问作者ip1234
相关产品推荐
相关产品推荐

