zoukankan      html  css  js  c++  java
  • 使用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>
    
  • 相关阅读:
    A/B test模块使用以及配置
    Linux下的tar压缩解压缩命令详解
    php mysql转义特殊字符的函数(转)
    cas server + cas client 单点登录 原理介绍
    php二维码的生产以及下载
    shiro 获取已经登录的用户
    Sql 根据多条件查询重复的数据 MySQL删除重复数据
    js base64 转PDF并下载,js baser64转图片并下载
    当同时安装Python2和Python3后,如何兼容并切换使用详解(比如pip使用)
    我的博客初始“话”
  • 原文地址:https://www.cnblogs.com/hooyeefam/p/15397488.html
Copyright © 2011-2022 走看看