使用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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM