gpt4 book ai didi

java - Spring boot + (JPA)-类别层次结构-递归遍历

转载 作者:行者123 更新时间:2023-12-02 12:10:55 24 4
gpt4 key购买 nike

我有目录实体 -

public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column
private String categoryName;

@ManyToOne
@JoinColumn(name = "parent_id")
private Category parent;

@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Category> children = new ArrayList<Category>();

@ManyToMany(mappedBy = "categories")
private Set<Product>

表中的记录:

id,  category_name,   parent_id
'1', 'HOME', NULL
'2', 'Category 1', '1'
'3', 'Category 2', '1'
'4', 'Sub-Category 1', '2'
'5', 'Sub-Category 1 2', '2'

以及 Controller 中的一些方法(在我的例子中,但问题是原则)

List<Category> categoryList = categoryRepository.findAll();

for (Category cat : cateList) {
recursiveTree(cat);
}



public void recursiveTree(Category cat) {
System.out.println(cat.getCategoryName());
if (cat.getChildren().size() > 0) {
for (Category c : cat.getChildren()) {
recursiveTree(c);
}
}
}

当我运行这个时,在控制台中我得到 -

HOME
Category 1
Sub-Category 1
Sub-Category 1 2
Category 2
Category 1
Sub-Category 1
Sub-Category 1 2
Category 2
Sub-Category 1
Sub-Category 1 2

如何修改递归,以便获得类别和子类别的正确顺序?我不明白为什么我会得到一些重复的数据

最佳答案

您获得重复数据,因为您使用 List<Category> categoryList = categoryRepository.findAll(); 从数据库中获取所有类别。

此列表包含 HOME、类别 1、类别 2、...

因为对于此列表中的每一项,您都调用 recursiveTree在主循环中的方法中,您将打印 HOME 的树(因此将打印其所有子级),您还将调用 recursiveTree对于类别 1,再次打印该类别及其子类别,依此类推。

如果您希望每个类别仅打印一次,则只需查找根类别(HOME 和任何其他没有父级的类别)并调用 recursiveTree对于那些。例如:

List<Category> rootCategoryList = categoryRepository.findByParentIsNull();
for (Category cat : rootCategoryList) {
recursiveTree(cat);
}

关于java - Spring boot + (JPA)-类别层次结构-递归遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46553925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com