Java 用MyBatis映射树?

Java 用MyBatis映射树?,java,java-8,mybatis,ibatis,Java,Java 8,Mybatis,Ibatis,我正试图通过建立一个树形结构并用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)

我正试图通过建立一个树形结构并用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的前向引用


那么,以前有人成功过吗?诀窍是什么?

我几年前在iBatis上做过这个,但从未对结果感到满意。我的树是只读的,这简化了代码。我还需要在树上下导航,这样每个记录都有一个父类指针。使用类名等的算法是:

将整个数据库表读入列表。这只是使用了“从层次结构中选择*”和标准结果映射。 遍历列表,在主键上形成一个索引映射,并注意根元素,它应该是唯一一个parentId为null的记录。 再次遍历列表,从映射中查找每个项的父记录,并调用this.setParentHierarchy parent和parent.addChildHierarchy child
这一切都很好,但远远不够优雅。正如您所指出的,它需要两次遍历列表。如果你找到更好的方法,请分享。

这里会使用自连接吗?@Shinchan我尝试过这个方法,如果你知道最大树深度,自连接是检索数据的一个选项。但我不知道如何安排iBatis/myBatis映射文件来生成正确链接的树。有什么想法吗?