开发中,经常遇到存在树形结构的数据,如行政区划这类数据,一级一级分层,后端需要组装好树形结构数据返回给前端。
由于返给前端的json数据中,如果是叶子节点了,说明它没有子节点,那么就没必要返回chirldren 属性给前端了,此时只需要加一个注解即可:@JsonInclude(JsonInclude.Include.NON_EMPTY)
,该注解会自动判断集合是否为空,为空的话就不返回给前端展示了。如果是String类型的属性的话,就使用@JsonInclude(JsonInclude.Include.NON_NULL)
注解
实体类:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* <p>
* 区域表
* </p>
*
* @author sgw
* @since 2023年09月06日
*/
@Data
@Accessors(chain = true)
@TableName("HJBZ_QY")
public class HjbzQy implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "ID", type = IdType.AUTO)
private String id;
/**
* 区域名称 0表示顶级区域
*/
@TableField("QYMC")
private String qymc;
/**
* 区域编码 0表示顶级区域
*/
@TableField("QYBM")
private String qybm;
/**
* 父级区域名称
*/
@TableField("PARENT_QYMC")
private String parentQymc;
/**
* 父级ID
*/
@TableField("PID")
private String pid;
/**
* 封装树结构数据
* exist设置该属性为 false,表示在查询中不使用该字段
* @JsonInclude(JsonInclude.Include.NON_EMPTY): 为空时就不返回给前端了(说明是叶子节点了,没必要返给前端一个空集合)
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
List<HjbzQy> chirldren = new ArrayList<>();
}
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ts.hjbz.entity.HjbzQy;
import com.ts.hjbz.dao.HjbzQyMapper;
import com.ts.hjbz.service.HjbzQyService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 区域表 服务实现类
* </p>
*
* @author sgw
* @since 2023年09月06日
*/
@Service
public class HjbzQyServiceImpl extends ServiceImpl<HjbzQyMapper, HjbzQy> implements HjbzQyService {
@Autowired
private HjbzQyMapper hjbzQyMapper;
@Override
public List<HjbzQy> getDetailTree() {
QueryWrapper<HjbzQy> wrapper = new QueryWrapper<>();
List<HjbzQy> hjbzQyList= hjbzQyMapper.selectList(wrapper);
//顶级节点的pid是0
List<HjbzQy> tree = createTree(hjbzQyList, "0");
return tree;
}
/**
* 递归建立树形结构 (算法)
* @param lists
* @param pid
* @return
*/
private List<HjbzQy> createTree(List<HjbzQy> lists, String pid) {
List<HjbzQy> tree = new ArrayList<>();
for (HjbzQy qy : lists) {
if (qy.getPid() .equals(pid) ) {
qy.setChirldren(createTree(lists,qy.getId()));
tree.add(qy);
}
}
return tree;
}
}