如何将一个对象中的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>
这样写完后,就能得到树结构了
