繁体   English   中英

如何使用mybatis实现递归映射?

[英]How to implement recursive mapping using mybatis?

我有一个java课

class Node {
  String id;
  String name;
  List<Node> children;
}

还有MySQL中的表:

NODES:
| ID | NAME |
| 1  | name1 |
| 2  | name2 |
| 3  | name3 |
| 4  | name4 |

和另一个关系表

RELATIONS:
| PARENT_ID | CHILD_ID |
|    1      |     2    |
|    2      |     3    |
|    2      |     4    |

通常我们可以使用左连接和集合将它们连接在一起,如下所示

<resultMap id="node" type="org.hello.Node>
  <id property="id" column="ID"/>
  <result property="name" column="NAME"/>
  <collection property="children" ofType="org.hello.Node" resultMap="node"/>
</resultMap>

<select id="select" resultMap="node">
 SELECT ID, NAME FROM NODES N
 LEFT JOIN RELATIONS R ON N.ID = R.PARENT_ID
 LEFT JOIN NODES N1 ON R.CHILD_ID = N1.ID
</select>

如果N1只是具有另一个模型的另一个表,它应该可以工作。 问题是我们如何编写mybatis xml配置以递归地映射上述指向自身的结构?

您只需要分配适当的列别名并使用columnPrefix

<resultMap type="org.hello.Node" id="node">
  <id property="id" column="ID" />
  <result property="name" column="NAME" />
  <collection property="children" resultMap="node"
    columnPrefix="C_"/>
</resultMap>

<select id="select" resultMap="node">
  SELECT
    N1.ID, N1.NAME,
    N2.ID C_ID, N2.NAME C_NAME,
  FROM NODES N1
  LEFT JOIN RELATIONS R1 ON R1.PARENT_ID = N1.ID
  LEFT JOIN NODES N2 ON N2.ID = R1.CHILD_ID
</select>

我还应该提到,由于columnPrefix是递归应用的,因此上述结果映射可用于任何级别的节点。

<select id="select" resultMap="node">
  SELECT
    N1.ID, N1.NAME,
    N2.ID C_ID, N2.NAME C_NAME,
    N3.ID C_C_ID, N3.NAME C_C_NAME
  FROM NODES N1
  LEFT JOIN RELATIONS R1 ON R1.PARENT_ID = N1.ID
  LEFT JOIN NODES N2 ON N2.ID = R1.CHILD_ID
  LEFT JOIN RELATIONS R2 ON R2.PARENT_ID = N2.ID
  LEFT JOIN NODES N3 ON N3.ID = R2.CHILD_ID
</select>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM