簡體   English   中英

用MyBatis映射樹?

[英]Mapping a tree with MyBatis?

我試圖通過設置樹結構並使用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做到了這一點,但對結果從未滿意。 我的樹是只讀的,這簡化了代碼。 我還需要上下導航樹,因此每個記錄都有一個父類指針。 該算法(使用您的類名等)為:

  1. 將整個數據庫表讀入列表。 這僅用於“從層次結構中選擇*”和標准結果映射。
  2. 遍歷列表,在主鍵上形成索引(Map),並注意根元素,該元素應該是唯一具有null parentId的記錄。
  3. 第二次遍歷列表,從Map中查找每個項目的父記錄,然后調用this.setParent(Hierarchy parent)parent.addChild(Hierarchy child)

這一切都很好,但遠非優雅。 如您所述,該列表需要兩次通過。 如果您找到更好的方法,請分享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM