如何将一个对象中的List对象添加为子集,且父结构不存在重复数据

如何将一个对象中的List对象添加为子集,且父结构不存在重复数据

有这样一个需求,把一个客户名下的联系人构建成下拉树结构。如 :

A公司

----联系人:张三

----联系人:李四

B公司

----联系人:王五

----联系人:赵六

 

客户数据结构

CREATE TABLE `os_customer` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(20) DEFAULT NULL COMMENT '客户公司名',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_time` datetime(3) DEFAULT NULL COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '更新人',
`update_time` datetime(3) DEFAULT NULL COMMENT '更新时间',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '删除标识(0:否 1:是)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='客户表';

已添加数据

客户-客户联系人表

CREATE TABLE `os_customer_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`customer_id` bigint(20) DEFAULT NULL COMMENT '客户公司id',
`user_id` bigint(20) DEFAULT NULL COMMENT '客户联系人id',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '是否删除(0:否 1:否)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='客户联系人-客户公司联系表';

已添加数据

 

 

客户联系人表

CREATE TABLE `sys_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`password` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',
`salt` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码盐',
`name` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
`avatar` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像地址',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别,1:男;2:女;',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`mobile` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '手机号码',
`email` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '邮箱',
`qq` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'QQ',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime(3) DEFAULT NULL COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改者',
`update_time` datetime(3) DEFAULT NULL COMMENT '修改时间',
`type` tinyint(1) DEFAULT NULL COMMENT '用户类型,0:系统管理员;1:管理员;2:普通用户;3客户',
`status` tinyint(1) DEFAULT NULL COMMENT '状态,0:已启用;1:已禁用;',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '删除状态,0:未删除;1:已删除;',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='系统用户';

已添加数据

 

 

 

 

 

刚开始想着直接用mysql联表查询出来。

mysql写法

<select id="getCustomerUserList" resultType="com.hnlrkj.order.vo.order.OrderCustomerVO>
      select
          oc.id customerId,
          ocu.customer_id parentId,
          oc.name customerName,
          su.id customerUserId,
          su.name customerUserName,
          su.mobile customerUserPhone
      from sys_user su
                left join os_customer_user ocu
                          on ocu.user_id = su.id
                left join os_customer oc
                          on oc.id = ocu.customer_id
      where su.type = 3
      ORDER BY oc.create_time
</select>

查询结果

 

 

这里有一个公司有两个联系人,最开始是直接把这个查询结果往一个最开始的OrderCustomerVO中放,再用java遍历去重,但是并没有成功

@Data
@Accessors(chain = true)
public class OrderCustomerVO {

  /**
    * 客户id
    */
  @JsonSerialize(using = IdSerialize.class)
  private Long customerId;

  /**
    * 客户名称
    */
  private String customerName;

  /**
    * 客户联系人id
    */
  @JsonSerialize(using = IdSerialize.class)
  private Long customerUserId;

  /**
    * 客户联系人姓名
    */
  private String customerUserName;

  /**
    * 客户联系人电话
    */
  private String customerUserPhone;
}

后面使用了mysql的结果集一对多的映射,修改返回视图OrderCustomerVO对象,把要添加的客户联系人作为子列表List,拆分成一个对象(private List<OrderCustomerUserVO> children;)

/**
* 客户及客户联系人视图
*
*/
@Data
@Accessors(chain = true)
public class OrderCustomerVO {

  /**
    * 客户id
    */
  @JsonSerialize(using = IdSerialize.class)
  private Long customerId;

  /**
    * 客户名称
    */
  private String customerName;

  /**
    * 客户联系人子集
    */
  private List<OrderCustomerUserVO> children;

}
/**
* 客户联系人VO
*/
@Data
@Accessors(chain = true)
public class OrderCustomerUserVO {

  /**
    * 客户联系人id
    */
  @JsonSerialize(using = IdSerialize.class)
  private Long customerUserId;

  /**
    * 客户联系人姓名
    */
  private String customerUserName;

  /**
    * 客户联系人电话
    */
  private String customerUserPhone;

}

mysql写法,这里需要注意,要把private List<OrderCustomerUserVO> children;作为映射的collection

<!-- 客户及客户联系人结果集-->
  <resultMap id="OrderCustomerVOMap" type="com.hnlrkj.order.vo.order.OrderCustomerVO">
      <id column="customerId" property="customerId"/>
      <result column="customerName" property="customerName"/>
      <collection property="children" ofType="com.hnlrkj.order.vo.order.OrderCustomerUserVO">
          <result column="customerUserId" property="customerUserId"/>
          <result column="customerUserName" property="customerUserName"/>
          <result column="customerUserPhone" property="customerUserPhone"/>
      </collection>
  </resultMap>

<select id="getCustomerUserList" resultMap="OrderCustomerVOMap">
      select
          oc.id customerId,
          ocu.customer_id parentId,
          oc.name customerName,
          su.id customerUserId,
          su.name customerUserName,
          su.mobile customerUserPhone
      from sys_user su
                left join os_customer_user ocu
                          on ocu.user_id = su.id
                left join os_customer oc
                          on oc.id = ocu.customer_id
      where su.type = 3
      ORDER BY oc.create_time
  </select>

这样写完后,就能得到树结构了

 

posted @ 2021-11-11 20:40  顺风顺水123  阅读(189)  评论(0)    收藏  举报