MyBatis-Plus 是如何查询 @TableField(exist = false) 的字段的?

新手上路,请多包涵

SegmentFault 的各位前辈好,我是名刚接触后端的萌新(团队大作业内卷严重,被迫赶鸭子上架)。
我在调试一段使用了 Spring Boot + MyBatis-Plus 的代码,遇到了一个让我和朋友百思不得其解的问题。

AtomicBoolean contains = new AtomicBoolean(false);
            List<MemberAccount> t = loginUser.getUser().getMemberAccountList();
            t.forEach(memberAccount -> {
                if (StrUtil.isNotEmpty(orgCode)) {
                    if (Objects.equals(memberAccount.getOrganization_code(), orgCode)) {
                        List<String> temp = memberAccount.getNodeList();
            // 使用了 lombok 的补全

这里的 Member 类实现如下:

@TableName("team_member")
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Member  extends BaseDomain implements Serializable {

    @TableId(type = IdType.AUTO)
    private Integer id;
    // ...一堆和列重名的字段
    private String dingtalk_userid;

    @TableField(exist = false)
    private String orgCode;
    // ...一堆没有出现在列名里的字段
    @TableField(exist = false)
    private List<MemberAccount> memberAccountList;
}

此外还有 MemberAccount

@TableName("team_member_account")
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MemberAccount extends BaseDomain implements Serializable {

    @TableId(type = IdType.AUTO)
    private Integer id;
    ...
    private String department;
    @TableField(exist = false)
    private List<String> nodeList;
    @TableField(exist = false)
    private List<Map<String, String>> departList;
}

它似乎的确返回了正确的结果:

image.png

image.png

我不能理解的是,源码中没有任何一个 Mapper 向系统说明了 MemberAccount 的组成,它就自动关联到了 team_member_account 这个表,查询到了正确的变量。
我一度怀疑是 MyBatis-Plus 可以识别 Java 源码中的 MemberAccount 类,然后根据它的构成补全查询语句,但是它还正确识别了 getNodeList() 这个方法,nodeList 可是字符串啊。
看了半天 MyBatis-Plus 的说明文档没想明白,恳请各位提点。

阅读 3.6k
1 个回答
新手上路,请多包涵

MemberAccount实体类中的注解@TableName("team_member_account")标识了该实体和数据库表的关联关系;
@TableField(exist = false)表示该字段不在数据库列中.你使用getNodeList() 能获取到数据是你的程序在其他地方做了setNodeList()操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题