一个表中通过parentId得到不同层的内容

 通过parentID来得到不同层次的内容(递归的方式获得)方法如下:

 

 public EnergyTree createTree(Long id) {
  // 先取第一层楼宇列表
  List<Building> bList = buildingService.getAllBuildings();
  // 创建楼宇树
  EnergyTree root = new EnergyTree();
  root.setTreeName("根目录");
  for (Building b : bList) {
   EnergyTree node = new EnergyTree();
   node.setBuildingId(b.getId());
   node.setTreeId(b.getId());
   node.setTreeName(b.getBuildingName());
   root.addChild(node);
   // 创建楼宇下面的子项
   List<EnergyItemName> eList = (List<EnergyItemName>) buildingService
     .getAllEnergyItemById(b.getId());
   for (EnergyItemName item : eList) {
    EnergyTree itemNode = new EnergyTree();
    itemNode.setTreeId(item.getId());
    itemNode.setTreeName(item.getEnergyItemName());
    itemNode.setParent(node);
    node.addChild(itemNode);
    this.addChild(itemNode);
   }
  }
  return root;
 }

 public void addChild(EnergyTree parentNode) {
  // 获取下属所有 列表
  List<EnergyItemName> eList = energyDataService.findAllChildsEIByParId(parentNode.getTreeId());
  for (EnergyItemName item : eList) {
   EnergyTree itemNode = new EnergyTree();
   itemNode.setBuildingId(item.getBuilding().getId());
   itemNode.setParent(parentNode);
   itemNode.setNodeType(item.getParentId());
   itemNode.setTreeId(item.getId());
   itemNode.setTreeName(item.getEnergyItemName());
   parentNode.addChild(itemNode);
   this.addChild(itemNode);
  }
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java中, 使用Mybatis Plus查询包含'test'的所有数据的所有父数据和子数据并存入数组中, 可以使用递归查询实现。 首先, 使用Mybatis Plus查询包含'test'的所有数据。 ```java List<Public> list = publicMapper.selectList(new QueryWrapper<Public>().like("name", "test")); ``` 然后遍历查询出来的数据, 对于每个数据, 递归查询其父节点和子节点, 并将结果存入数组中。 ```java List<Public> result = new ArrayList<>(); for (Public p : list) { result.add(p); getParent(p, result); getChild(p, result); } private void getParent(Public p, List<Public> result) { if (p.getParentid() != null) { Public parent = publicMapper.selectById(p.getParentid()); result.add(parent); getParent(parent, result); } } private void getChild(Public p, List<Public> result) { List<Public> childList = publicMapper.selectList(new QueryWrapper<Public>().eq("parentid", p.getId())); if (!childList.isEmpty()) { result.addAll(childList); for (Public child : childList) { getChild(child, result); } } } ``` 最后得到的result就是所有符合条件的父子节点. 需要注意的是,这个例子中的父子关系是单向的,如果需要双向查询还需要在getParent函数中加上对子节点的查询。 ### 回答2: 在Java中,可以通过MyBatisPlus实现查询name字段中包含"test"的所有数据的父数据和子数据,并将数据存入数组中的操作。 首先,创建一个实体类来映射数据库表的结构,包括idparentId和name三个属性,并使用相应的注解进行映射配置。 然后,在父子关系的表对应的Mapper接口中,定义一个自定义的查询方法,用于查询name字段中包含"test"的所有数据的父数据和子数据。方法的返回类型为List集合,用于存储查询结果。 在Mapper接口对应的Mapper.xml中,编写查询语句。在该查询语句中,使用递归(Recursive)查询的方式,通过idparentId字段的关联,获取所有父数据和子数据。在查询的条件中,通过name字段进行模糊查询,判断是否包含"test"字符串。 最后,在Java代码中,调用该自定义的查询方法,将查询结果存入List集合,并返回给调用方。 以下为示例代码: 1. 创建实体类: ```java public class PublicEntity { private Long id; private Long parentId; private String name; // 省略getter和setter方法 } ``` 2. 定义Mapper接口: ```java public interface PublicMapper extends BaseMapper<PublicEntity> { List<PublicEntity> findAllByNameContainingTest(); } ``` 3. 定义Mapper.xml: ```xml <mapper namespace="com.example.mapper.PublicMapper"> <select id="findAllByNameContainingTest" resultType="com.example.entity.PublicEntity"> with recursive cte(id, parentId, name) as ( select id, parentId, name from public where name like '%test%' union all select p.id, p.parentId, p.name from public p inner join cte on cte.id = p.parentId ) select * from cte; </select> </mapper> ``` 4. 在Java代码中调用查询方法: ```java @Autowired private PublicMapper publicMapper; public List<PublicEntity> queryData() { return publicMapper.findAllByNameContainingTest(); } ``` 以上代码实现了通过MyBatisPlus查询name中包含"test"的所有数据的父数据和子数据,并将数据存入List集合中。可以根据实际情况进行调整和优化。 ### 回答3: 在Java中使用Mybatis Plus进行查询,可以通过以下步骤实现: 1. 首先,创建一个Mapper接口,用于定义查询方法,该接口需要继承BaseMapper接口,并使用@Mapper注解标记。 2. 在Mapper接口中定义一个查询方法,例如findByNameContaining,用于查询name字段包含指定字符串的数据。方法的返回类型可以是List<Map<String, Object>>或者自定义的实体类。 3. 在Mybatis的mapper.xml文件中,编写对应的SQL查询语句,可以使用like关键字来进行模糊查询。 4. 在Java中使用Mapper接口进行查询,获取符合条件的数据,可以通过Mybatis Plus封装的方法来进行查询,如selectList、selectMaps等。 5. 获取查询结果后,可以通过递归的方式,根据父ID递归查询父数据和子数据,并将数据存入数组中。 以下是一个简单的示例代码: ```java // 创建Mapper接口 @Mapper public interface PublicMapper extends BaseMapper<PublicEntity> { List<Map<String, Object>> findByNameContaining(String keyword); } // 在Mapper.xml文件中编写SQL查询语句 <select id="findByNameContaining" resultType="map"> SELECT * FROM public WHERE name LIKE CONCAT('%', #{keyword}, '%') </select> // 在调用中使用Mapper进行查询 @Autowired private PublicMapper publicMapper; public void queryData(){ String keyword = "test"; List<Map<String, Object>> result = publicMapper.findByNameContaining(keyword); List<Object> dataList = new ArrayList<>(); for (Map<String, Object> map : result) { Object parentId = map.get("parentId"); Object id = map.get("id"); // 查询父数据 List<Map<String, Object>> parentData = queryParentData(parentId); // 查询子数据 List<Map<String, Object>> childData = queryChildData(id); // 将数据存入数组 dataList.add(map); dataList.addAll(parentData); dataList.addAll(childData); } } private List<Map<String, Object>> queryParentData(Object parentId) { // 根据parentId查询父数据 // ... } private List<Map<String, Object>> queryChildData(Object id) { // 根据id查询子数据 // ... } ``` 通过以上代码,你可以在Mybatis Plus中实现查询name中包含test的所有数据的所有的父数据和子数据,并将数据存入数组中。但要注意,以上代码仅提供一个简单示例,具体应用中可能需要根据实际情况进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值