java代码:
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 名称
*/
private String name;
/**
* 关键词
*/
private String keywords;
/**
* 描述
*/
private String description;
/**
* 层级
*/
private Integer level;
/**
* 排序
*/
private Integer sequence;
/**
* 子类
*/
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
@OrderBy("sequence asc")
private List<Category> children = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getKeywords() {
return keywords;
}
public void setKeywords(String keywords) {
this.keywords = keywords;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public Integer getSequence() {
return sequence;
}
public void setSequence(Integer sequence) {
this.sequence = sequence;
}
public List<Category> getChildren() {
return children;
}
public void setChildren(List<Category> children) {
this.children = children;
}
@Override
public String toString() {
return "Category [id=" + id + ", name=" + name + ", keywords=" + keywords + ", description="
+ description + ", level=" + level + ", sequence=" + sequence + ", children="
+ children + "]";
}
}
生成的数据库如图:
初始化数据sql:
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('1', NULL, NULL, '0', '根目录', NULL, '0');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('2', NULL, NULL, '1', '河北', NULL, '1');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('3', NULL, NULL, '1', '山东', NULL, '1');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('4', NULL, NULL, '1', '湖南', NULL, '1');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('5', NULL, NULL, '2', '石家庄', NULL, '2');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('6', NULL, NULL, '2', '邢台', NULL, '2');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('7', NULL, NULL, '2', '济南', NULL, '3');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('8', NULL, NULL, '2', '临沂', NULL, '3');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('9', NULL, NULL, '2', '长沙', NULL, '4');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('10', NULL, NULL, '2', '株洲', NULL, '4');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('11', NULL, NULL, '2', '湘潭', NULL, '4');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('12', NULL, NULL, '3', '桥东区', NULL, '5');
INSERT INTO `category` (`id`, `description`, `keywords`, `level`, `name`, `sequence`, `parent_id`) VALUES ('13', NULL, NULL, '3', '桥西区', NULL, '5');
查询代码:
Page<Category> page = categoryRepository.findAll(PageRequest.of(0, 20)); // 第一个参数如果是1的话,查到的是第二页的数据
Optional<Category> findById = categoryRepository.findById(2);
Category category2 = findById.get();
System.out.println(category2);
数据如下:
Category
[id=2, name=河北, keywords=null, description=null, level=1, sequence=null,
children=[Category
[id=5, name=石家庄, keywords=null, description=null, level=2, sequence=null,
children=[Category [id=12, name=桥东区, keywords=null, description=null, level=3, sequence=null,
children=[]], Category [id=13, name=桥西区, keywords=null, description=null, level=3, sequence=null,
children=[]]]], Category [id=6, name=邢台, keywords=null, description=null, level=2, sequence=null, children=[]]]
]
可见,这样设计勉强能实现树形菜单的功能。但是如果要找父节点不好找。还需要改进。