使用Mybatis-plus通过自定义Sql查询只有主键为null的问题

最近我在通过在XML文件中自定义SQl的时候,遇到了一个奇怪的问题。

数据库表(tab_user)结构如下:

实体如下:

@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Data
@TableName(value = "tab_user")
public class User implements Serializable {

    @TableId(value = "pk_user_id",type = IdType.AUTO)
    private Integer userId;

    private String userName;

    private String userSex;
}

定义的Mapper如下:

<select id="selectAllbySex" resultTyep="cn.entity.User">
          SELECT * FROM tab_user ${ew.customSqlSegment}
</select>

使用继承于BaseMapper<T>中的方法都是正常的,没有问题。
但自定义sql查询回来的其他属性皆是正常的,唯独主键(与列名不一致)为null。

这个问题非常奇怪但是又非常严重,主键没了这可咋整阿!于是转头去看控制台产生的打印的sql语句,发现Sql语句里是有userId这个属性的。
所以,问题非常明显出在了查询结果映射到实体这一环节。

但是,我明明已经为主键添加了@TableId注解,否则继承于BaseMapper<T>的方法也不可能正常执行,我百思不得其解。
搜索了好几个关键字也没找到类似的问题,直到我点开了MybatisPuls官方的github地址,发现了这样一个issue。
地址:https://github.com/baomidou/mybatis-plus/issues/3976

大概看了一下,这位大兄弟和我及其相似的遭遇,不同的是他是非主键属性,我是主键属性,并且他和我都是属性名与列名不同。
当我看到了这里时,我瞬间豁然开朗....

我靠!!!这不就是我告诉张三他表哥他妈穿红色衣服,然后我去问张三他妈穿的啥颜色衣服吗?
于是问题解决了,在不能修改表名的情况下(建议列名和属性名一致,或者满足驼峰命名法,如pk_user_id则为pkUserId,下划线转驼峰需要在配置文件中application.properties添加mybatis.configuration.map-underscore-to-camel-case=true
告诉mybatis映射关系就好。
修改xml的内容如下:

<select id="selectAllbySex" resultMap="userResultMap">
          SELECT * FROM tab_user ${ew.customSqlSegment}
</select>

添加映射关系:

<resultMap id="userResultMap" type="cn.entity.User">
    <id column="pk_user_id" property="userId"></id>
</resultMap>
posted @   古宇  阅读(1285)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧

欢迎来刀

点击右上角即可分享
微信分享提示