我有目录实体 -
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
如何修改递归,这样我才能得到类别和子类别的正确顺序?我无法弄清楚为什么我会得到一些重复数据
答案 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>