最近我在通过在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>