介绍
在使用MyBatis Plus进行开发时,遇到实体类字段缺失问题。错误提示显示需要某些字段,但实体类中并未定义这些字段。
1.原因
实体类没有重写TreeNode类所要求的方法和字段,导致树形工具类在操作时无法找到必要的字段或方法。
树形工具类
ts
public abstract class TreeNode {
/**
* 当前节点id
*/
public abstract Long getNodeId();
/**
* 父级节点id
*/
public abstract Long getNodePId();
/**
* 是否根节点
*/
@Getter
private Boolean rootNode;
/**
* 是否叶子节点
**/
@Getter
private Boolean leafNode;
/**
* 子节点数据
**/
@Getter
private List<TreeNode> children;
/**
* 设置子节点数据,设置为protected禁止外部调用
**/
public void setChildren(List<TreeNode> children) {
this.children = children;
this.rootNode = Objects.equals(getNodePId(), -1L);
this.leafNode = children == null || children.isEmpty();
}
}
2.未修改前的实体类
ts
@Getter
@Setter
@TableName("share_comment_reply")
public class ShareCommentReply extends TreeNode implements Serializable {
// ... 其他字段
@Override
public Long getNodeId() {
return id;
}
@Override
public Long getNodePId() {
return parentId;
}
}
2.修改后的实体类
ts
@Getter
@Setter
@TableName("share_comment_reply")
public class ShareCommentReply extends TreeNode implements Serializable {
// ... 其他字段
@Override
public Long getNodeId() {
return id;
}
@Override
public Long getNodePId() {
return parentId;
}
// 添加 children 字段(非数据库字段)
@TableField(exist = false)
private List<TreeNode> children;
@TableField(exist = false)
private Boolean rootNode;
@TableField(exist = false)
private Boolean leafNode;
@Override
public void setChildren(List<TreeNode> children) {
this.children = children;
this.rootNode = Objects.equals(getNodePId(), -1L);
this.leafNode = children == null || children.isEmpty();
}
}
总结
实体类继承了TreeNode类,但只实现了部分方法getNodeId()
和getNodePId()
, 缺失接口要求的其他方法和字段,导致树形工具类操作时无法设置子节点列表。