间接关联
模型
@EqualsAndHashCode(callSuper = true)
@Data
@Model(title = "用户")
public class User extends BaseModel {
@Column(title = "ID")
@Primary
@DefaultOrder
private String id;
@Column(title = "名字")
private String name;
}
@EqualsAndHashCode(callSuper = true)
@Data
@Model(title = "文章")
public class Article extends BaseModel {
@Column(title = "ID")
@Primary
@DefaultOrder
private String id;
@Column(title = "标题")
private String title;
@Column(title = "作者ID")
private String uid;
@Column(title = "所属分组ID")
private String groupId;
}
@EqualsAndHashCode(callSuper = true)
@Data
@Model(title = "分组")
public class Group extends BaseModel {
@Column(title = "ID")
@Primary
@DefaultOrder
private String id;
@Column(title = "分组名称")
private String name;
}
@EqualsAndHashCode(callSuper = true)
@Data
@Model(title = "标签")
public class Tag extends BaseModel {
@Column(title = "ID")
@Primary
@DefaultOrder
private String id;
@Column(title = "标签名称")
private String name;
}
@EqualsAndHashCode(callSuper = true)
@Data
@Model(title = "文章标签中间表")
public class ArticleTag extends BaseModel {
@Column(title = "ID")
@Primary
@DefaultOrder
private String id;
@Column(title = "文章ID")
private String articleId;
@Column(title = "文章ID")
private String tagId;
}
@EqualsAndHashCode(callSuper = true)
@Data
@Model(title = "评论")
public class Comment extends BaseModel {
@Column(title = "ID")
@Primary
@DefaultOrder
private String id;
@Column(title = "父级ID")
private String parentId;
@Column(title = "发送者")
private String uid;
@Column(title = "回复评论ID")
private String replyCommentId;
// 一般可以设计一些冗余字段,优化这种间接关联,此处注释方便示例
// @Column(title = "回复评论用户ID")
// private String replyCommentUid;
}
一对一
@EqualsAndHashCode(callSuper = true)
@Data
@Model(table = false)
public class CommentModel extends Comment {
// left join user on user.id[主键] = comment.uid[关联键]
@Join(rightJoinField = "uid")
private User sender;
// 自关联,不常用
// left join comment as replyComment on replyComment.id[主键] = comment.replyCommentId[关联键]
@Join(rightJoinField = "replyCommentId")
private Comment replyComment;
// left join user as replyCommentSender on replyCommentSender.id[主键] = replyComment.uid[关联键]
@Join(rightJoinField = "uid", indirectJoinField = "replyComment")
private User replyCommentSender;
}
一对多
此类间接关联是完全禁用的,一是设计基于当前模型避免间接查询扩散,因此完全不可用,二是仍会导致 _getList 返回扁平化数据的分页异常
使用以下写法避免,需要的时候传入 articleId 做一次查询即可,同时可以在 Article 中做 tagList 的冗余 json 字段,方便实际使用
@EqualsAndHashCode(callSuper = true)
@Data
@Model(table = false)
public class ArticleTagModel extends ArticleTag {
// left join tag on tag.id[主键] = articleTag.tagId[关联键]
@Join(rightJoinField = "tagId")
private Tag tag;
}