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;
}
它似乎的确返回了正确的结果:
我不能理解的是,源码中没有任何一个 Mapper 向系统说明了 MemberAccount
的组成,它就自动关联到了 team_member_account
这个表,查询到了正确的变量。
我一度怀疑是 MyBatis-Plus 可以识别 Java 源码中的 MemberAccount
类,然后根据它的构成补全查询语句,但是它还正确识别了 getNodeList()
这个方法,nodeList
可是字符串啊。
看了半天 MyBatis-Plus 的说明文档没想明白,恳请各位提点。
MemberAccount实体类中的注解@TableName("team_member_account")标识了该实体和数据库表的关联关系;
@TableField(exist = false)表示该字段不在数据库列中.你使用getNodeList() 能获取到数据是你的程序在其他地方做了setNodeList()操作