如何使用mybatis实现递归映射?
How to implement recursive mapping using mybatis?
我有一个javaclass
class Node {
String id;
String name;
List<Node> children;
}
以及 MySQL 中的 table:
NODES:
| ID | NAME |
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
和另一个table关系
RELATIONS:
| PARENT_ID | CHILD_ID |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |
通常我们可以使用 left join 和 collection 将它们连接在一起,如下所示
<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
只是另一个 table 与另一个模型,它应该工作。问题是我们如何编写 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>
我有一个javaclass
class Node {
String id;
String name;
List<Node> children;
}
以及 MySQL 中的 table:
NODES:
| ID | NAME |
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
和另一个table关系
RELATIONS:
| PARENT_ID | CHILD_ID |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |
通常我们可以使用 left join 和 collection 将它们连接在一起,如下所示
<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
只是另一个 table 与另一个模型,它应该工作。问题是我们如何编写 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>