关于MySQL数据表的联合查询传到MyBatis对应实体类的理解

关于MySQL数据表的联合查询传到MyBatis对应实体类的理解

  • SQL查询某个父节点下的子节点
SELECT
	m1.*, m2.id AS id2,
	m2.url AS urL2,
	m2.path AS path2,
	m2.component AS component2,
	m2.`name` AS name2,
	m2.iconCls AS iconCls2,
	m2.keepAlive AS keepAlive2,
	m2.requireAuth AS requireAuth2,
	m2.parentId AS parentId2,
	m2.enabled AS enabled2
FROM
	menu AS m1,
	menu AS m2
WHERE
	m1.id = m2.parentId
AND m1.id = 2
  • 查询的结果
id url path component name iconCls keepAlive requireAuth parentId enabled id2 url2 path2 component2 name2 iconCls2 keepAlive2 requireAuth2 parentId2 enabled2
2 / /home Home 员工资料 fa fa-user-circle-o 1 1 1 7 /employee/basic/** /emp/basic EmpBasic 基本资料 1 2 1
2 / /home Home 员工资料 fa fa-user-circle-o 1 1 1 8 /employee/advanced/** /emp/adv EmpAdv 高级资料 1 2 0
  • 实体类
package com.fern.vhr.model;

import java.util.List;

public class Menu {
    private Integer id;

    private String url;

    private String path;

    private String component;

    private String name;

    private String iconcls;
    
    private Integer parentid;

    private Boolean enabled;
    
	private Meta meta;

    private List<Menu> children;
    
    //getter...
    //setter...
    
}
  • MyBastis的mapper.xml
<resultMap id="BaseResultMap" type="com.fern.vhr.model.Menu" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="url" property="url" jdbcType="VARCHAR" />
    <result column="path" property="path" jdbcType="VARCHAR" />
    <result column="component" property="component" jdbcType="VARCHAR" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="iconCls" property="iconcls" jdbcType="VARCHAR" />
    <result column="parentId" property="parentid" jdbcType="INTEGER" />
    <result column="enabled" property="enabled" jdbcType="BIT" />
    <association property="meta" javaType="com.fern.vhr.model.Meta">
      <result column="keepAlive" property="keepalive" jdbcType="BIT" />
      <result column="requireAuth" property="requireauth" jdbcType="BIT" />
    </association>
    <!--实体类中集合  property属性名  javaType集合类型   ofType泛型-->
    <collection property="children" javaType="java.util.List" ofType="com.fern.vhr.model.Menu">
      <id column="id2" property="id" jdbcType="INTEGER" />
      <result column="url2" property="url" jdbcType="VARCHAR" />
      <result column="path2" property="path" jdbcType="VARCHAR" />
      <result column="component2" property="component" jdbcType="VARCHAR" />
      <result column="name2" property="name" jdbcType="VARCHAR" />
      <result column="iconCls2" property="iconcls" jdbcType="VARCHAR" />
      <result column="parentId2" property="parentid" jdbcType="INTEGER" />
      <result column="enabled2" property="enabled" jdbcType="BIT" />
      <association property="meta" javaType="com.fern.vhr.model.Meta">
        <result column="keepAlive2" property="keepalive" jdbcType="BIT" />
        <result column="requireAuth2" property="requireauth" jdbcType="BIT" />
      </association>
    </collection>
  </resultMap>

	<select id="getMenuByhrId" resultMap="BaseResultMap" parameterType="java.lang.Integer">
   SELECT m1.*,m2.id as id2,m2.url as urL2,m2.path as path2,m2.component as component2,m2.`name`as name2,m2.iconCls as iconCls2,m2.keepAlive as keepAlive2,m2.requireAuth as requireAuth2,m2.parentId as parentId2,m2.enabled as enabled2 from menu as m1,menu as m2 WHERE m1.id=m2.parentId
and m1.id=#{id}
  </select>

  • 结果
{
    "id": 2,
    "url": "/",
    "path": "/home",
    "component": "Home",
    "name": "员工资料",
    "iconcls": "fa fa-user-circle-o",
    "meta": {
        "keepalive": null,
        "requireauth": true
    },
    "children": [
        {
            "id": 7,
            "url": "/employee/basic/**",
            "path": "/emp/basic",
            "component": "EmpBasic",
            "name": "基本资料",
            "iconcls": null,
            "meta": {
                "keepalive": null,
                "requireauth": true
            },
            "children": null,
            "parentid": 2,
            "enabled": true
        },
        {
            "id": 8,
            "url": "/employee/advanced/**",
            "path": "/emp/adv",
            "component": "EmpAdv",
            "name": "高级资料",
            "iconcls": null,
            "meta": {
                "keepalive": null,
                "requireauth": true
            },
            "children": null,
            "parentid": 2,
            "enabled": false
        }
    ],
    "parentid": 1,
    "enabled": true
}
  • 按我写之前的想法,应该是联合查询出来两行员工资料,按理查询出来的json数据也应该有两个员工资料,但结果显然打了我的脸。
  • 因此我估计应该是mybatis将联合查询出来的多余重复数据自动去除了

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35953966/article/details/104718005