我试图通过设置树结构并将其映射到MyBatis来混淆我的方式。我的表定义为;
CREATE TABLE `Hierarchy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parentId` int(11) NULL DEFAULT NULL,
`name` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我尝试在MyBatis中使用;
进行关联@Select(SELECT_ALL)
@Results(value = {
@Result(property = "id", column = "id"),
@Result(property = "children", column = "parentId",
jdbcType = JdbcType.NUMERIC,
many = @Many(select = "selectById")),
@Result(property = "name", column = "name")
})
List<Hierarchy> selectAll();
我的班级有;
private Integer id;
private Integer parentId;
private String name;
private List<Hierarchy> children;
我很快就意识到这不会起作用,因为它最终会向后关联,并且我会在结果集中多次让孩子回来。那么答案是什么?我做完选择之后是否必须进行迭代并以这种方式填充我的孩子?
我尝试了一些方法,但它们看起来都非常低效,而且我发现很难处理父ID的前向引用而不重复列表两次。
那么,有没有人在此之前撤下这个?这个诀窍是什么?
答案 0 :(得分:1)
几年前我和iBatis一起做过这件事,并且从未对结果感到满意。我的树是只读的,简化了代码。我还需要上下导航树,因此每个记录都有一个父类指针。算法(使用你的类名等)是:
这一切都很好,但远非优雅。如你所知,它需要两次通过列表。如果您找到更好的方法,请分享。