[mybatis/mybatis-3]mybatis-plus + postgresql 无法映射父类实体

2023-12-12 558 views
1

这是我的基础实体

package com.txys.system.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;

@Data
public abstract class BaseEntity<T> extends Model<BaseEntity<T>> {

    @TableField(value = "createdBy")
    private String createdBy;

    @TableField(value = "createdAt")
    private String createdAt;

    @TableField(value = "updatedAt")
    private String updatedAt;

    @TableField(value = "updatedBy")
    private String updatedBy;

    @TableField(value = "deletedAt")
    private String deletedAt;
}

这是我的系统用户表

package com.txys.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

@TableName("\"SystemUser\"")
@Data
public class SystemUser extends BaseEntity<SystemUser> implements Serializable {

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

    @TableField(value = "username")
    private String username;

    @TableField(value = "password")
    private String password;
}
1、我现在的问题是:继承了BaseEntity父类,调用selectById,
SELECT id,username,password,createdBy,createdAt,updatedAt,updatedBy,deletedAt FROM "SystemUser" WHERE id=?

查询的时候会自动加上父类继承的字段,如果父类字段加上exsit=false,那么查询就也不会带上父类字段,但是以前使用MySQL的时候是可以被识别的。

查询结果映射的时候,会报错:

Error querying database. Cause: org.postgresql.util.PSQLException: 错误: 字段 "createdby" 不存在

也就是说:映射找不到继承的父类公共字段

问过mybatis-plus官方,他们说是postgresql驱动那边的异常,但没有具体告诉我该怎么去排查解决,网上也没有搜到此类类似的问题。

回答

0

当我可以确认问题属于 mybatis 时,我会提供人工翻译。@harawata @hazendaz

您是否可以在 github 上提供完整的演示并提供详细信息?@esbug 或者说是 postgresql 的问题,在这里提出问题似乎不是特别合适。

9

此问题的人工翻译:

这是我的基础实体:

package com.txys.system.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;

@Data
public abstract class BaseEntity<T> extends Model<BaseEntity<T>> {

    @TableField(value = "createdBy")
    private String createdBy;

    @TableField(value = "createdAt")
    private String createdAt;

    @TableField(value = "updatedAt")
    private String updatedAt;

    @TableField(value = "updatedBy")
    private String updatedBy;

    @TableField(value = "deletedAt")
    private String deletedAt;
}

这是我的系统用户:

package com.txys.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

@TableName("\"SystemUser\"")
@Data
public class SystemUser extends BaseEntity<SystemUser> implements Serializable {

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

    @TableField(value = "username")
    private String username;

    @TableField(value = "password")
    private String password;
}

你可以看到我继承自BaseEntity。当我执行selectById

SELECT id,username,password,createdBy,createdAt,updatedAt,updatedBy,deletedAt FROM "SystemUser" WHERE id=?

它会给出一条消息:

Error querying database. Cause: org.postgresql.util.PSQLException: Error: Field "createdby"not exist

在MySQL中,我可以使用“继承”字段,但在postgresql中,它不起作用。mybatis plus官方告诉我问题出在postgresql驱动上,但我不知道如何解决这个问题。

1

你好@esbug,

createdby该错误表明表中没有列。

如果实际的列名是createdBy,则必须在SQL语句中用双引号括起来,即"createdBy"。请参阅https://stackoverflow.com/a/20880247/1261766

关闭,因为这不是 MyBatis 问题。

ps 感谢您的翻译,@awxiaoxian2020!