mybatis映射时候的注意点

另外,请注意,结果映射中使用了column="sh.id",这意味着MyBatis会查找结果集中列名为sh.id的列。但是,在SQL中,我们使用sh.id作为列名,这会导致结果集中的列名也是sh.id(包括别名中的点)。

这可能会引起问题,因为点通常用于嵌套结果映射。实际上,在SQL中,使用sh.id作为列名,结果集中的列名会是sh.id(字符串),而不是id。这可能导致MyBatis无法正确映射。

1. 检查SQL别名和结果映射的对应关系

你的SQL是:

sql

复制代码
SELECT sh.id,sh.history_id,sh.announcement_id,u.id,u.avatar_url,u.nickname

但结果映射是:

xml

复制代码
<resultMap id="SeeHistoryWithUserVOResult" type="com.hgwy.notification.business.vo.SeeHistoryWithUserVO">
    <result property="id" column="sh.id"/>          <!-- SQL中是 sh.id -->
    <result property="userId" column="u.id"/>       <!-- SQL中是 u.id -->
    <result property="announcementId" column="sh.announcement_id"/>
    <result property="historyId" column="sh.history_id"/>
    <result property="avatarUrl" column="u.avatar_url"/>
    <result property="nickname" column="u.nickname"/>
</resultMap>

问题 :SQL中的列名是sh.id,但结果映射期望的列名是sh.id。实际上,SQL返回的列名中会包含.,这可能导致MyBatis无法正确映射。

2. 修改SQL使用别名(推荐)

将SQL修改为使用明确的无点号别名:

xml

复制代码
<select id="selectSeeHistoryUserList" parameterType="Long" resultMap="SeeHistoryWithUserVOResult">
    SELECT 
        sh.id as sh_id,
        sh.history_id as history_id,
        sh.announcement_id as announcement_id,
        u.id as user_id,
        u.avatar_url as avatar_url,
        u.nickname as nickname
    FROM see_history sh  
    LEFT JOIN `user` u ON sh.user_id = u.id 
    WHERE sh.announcement_id = #{announcementId}
</select>

相应地修改结果映射:

xml

复制代码
<resultMap id="SeeHistoryWithUserVOResult" type="com.hgwy.notification.business.vo.SeeHistoryWithUserVO">
    <result property="id" column="sh_id"/>
    <result property="userId" column="user_id"/>
    <result property="announcementId" column="announcement_id"/>
    <result property="historyId" column="history_id"/>
    <result property="avatarUrl" column="avatar_url"/>
    <result property="nickname" column="nickname"/>
</resultMap>
相关推荐
亦暖筑序28 分钟前
AgentScope-Java 入门:用 Middleware 审计 Agent 调用
java·ai编程·agentscope
你驴我38 分钟前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
青山木1 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
小龙报2 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
自强的小白2 小时前
重点!起始时间和结束时间与创建时间和修改时间的区别(localdate与LocaldateTIME区别)以及增删改查什么时候设置目前时间(添加和更新员工时)
java
雪的季节2 小时前
Python 线程同步与异步编程 全解析
java·开发语言
吃饱了得干活2 小时前
缓存与数据库一致性:从理论到实战
java·后端·面试
520拼好饭被践踏2 小时前
JAVA+Agent学习day22
java·开发语言·后端·学习
笨蛋不要掉眼泪3 小时前
Java虚拟机:堆的参数配置
java·开发语言·jvm
霸道流氓气质3 小时前
SpringBoot中使用JasperReports 报表引擎 — 介绍、原理与使用实践
java·spring boot·后端