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

时间:2017-10-03 21:45:48

标签: 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'

控制器中的一些方法(在我的情况下,但问题是原则)

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

如何修改递归,这样我才能得到类别和子类别的正确顺序?我无法弄清楚为什么我会得到一些重复数据

2 个答案:

答案 0 :(得分:1)

您获得重复数据,因为您使用List<Category> categoryList = categoryRepository.findAll();

从数据库中提取所有类别

此列表包含HOME,Category 1,Category 2,...

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

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

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

答案 1 :(得分:0)

要显示百万美分中的类别树,此代码可以正常运行

<div th:fragment="submenu">
        <ul>
            <li th:each="cat : ${categories}">
            <span th:text="${cat.categoryName}"></span>
                <div th:with="categories = ${cat.children}" th:include="admin/fragments/info :: submenu"></div>
            </li>
        </ul>
    </div>