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

标签 java spring jpa recursion

我有目录实体 -

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/

相关文章:

java - 我需要什么 hadoop jar 来获得 WeightAdjuster 界面

java - 在一个实体中映射三个相同的表

java - AtomicInteger 中的 get() 与 intValue() 方法

eclipse - 持久性单元定义冲突

hibernate - 具有复合主键的一对一双向映射

java - 尝试调用 JPA 函数时出现语法错误

java - 使用 json 将 javascript 数组传递给 java 数组

Spring 和 thymeleaf : changing locale and stay on the current page

java - Bean集合Spring : ConversionNotSupportedException

java - 无需组件扫描或 bean 定义即可定义 Controller