使用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
告诉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>
原文地址:https://www.cnblogs.com/hooyeefam/p/15397488.html