开发中,经常遇到存在树形结构的数据,如行政区划这类数据,一级一级分层,后端需要组装好树形结构数据返回给前端。
由于返给前端的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 {@Autowiredprivate HjbzQyMapper hjbzQyMapper;@Overridepublic List<HjbzQy> getDetailTree() {QueryWrapper<HjbzQy> wrapper = new QueryWrapper<>();List<HjbzQy> hjbzQyList= hjbzQyMapper.selectList(wrapper);//顶级节点的pid是0List<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;}
}