我有目录实体 -
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/