You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"/>
    

验证步骤

  1. 检查SubmitMapperlfc接口中getRotnAndLegs方法的返回类型和注解配置;
  2. 核对SbmtMapper.xml中rotsMap的完整配置,确认是否存在嵌套映射;
  3. 临时修改SQL,将ROTATION_ID替换为非NULL值(比如1),测试是否仍报错,快速验证问题根源。

内容的提问来源于stack exchange,提问作者ip1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:06:04