Java Spring boot中的多级子菜单JSON

Java Spring boot中的多级子菜单JSON,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我在表中有一些记录有亲子关系,屏幕截图如下: 如何编写JPA实体来检索有关父子关系的记录。谢谢你的帮助 对我没有帮助的代码如下: @Entity @Table(name = PlatformConstant.TABLE_MENU) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Menu implements Serializable { private static final lo

我在表中有一些记录有亲子关系,屏幕截图如下:

如何编写JPA实体来检索有关父子关系的记录。谢谢你的帮助

对我没有帮助的代码如下:

@Entity
@Table(name = PlatformConstant.TABLE_MENU)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Menu implements Serializable {

   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @NotNull
   @Column(name = "url", nullable = false)
   private String url;

   @Column(name = "description")
   private String description;

   @Column(name = "qr_code")
   private Blob qrCode;

   @JsonManagedReference
   @OneToMany(mappedBy = "parent")
   private Set<Menu> children;

   @ManyToOne
   @JsonBackReference
   private Menu parent; 
}
@实体
@表格(名称=平台常数。表格菜单)
@缓存(用法=缓存并发策略。非严格读写)
公共类菜单实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@NotNull
@列(name=“url”,nullable=false)
私有字符串url;
@列(name=“description”)
私有字符串描述;
@列(name=“qr\U代码”)
私有Blob码;
@JsonManagedReference
@OneToMany(mappedBy=“家长”)
私人儿童;
@许多酮
@JsonBackReference
私有菜单父菜单;
}
我上面的代码有以下错误输出:

使用JpaRepository find all并应用@lucid的答案,新的输出如下:

@Entity
@Table(name = PlatformConstant.TABLE_MENU)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Menu implements Serializable {

   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @NotNull
   @Column(name = "url", nullable = false)
   private String url;

   @Column(name = "description")
   private String description;

   @Column(name = "qr_code")
   private Blob qrCode;

   @JsonManagedReference
   @OneToMany(mappedBy = "parent")
   private Set<Menu> children;

   @ManyToOne
   @JsonBackReference
   private Menu parent; 
}
守则:

@Autowired
private MenuService menuService;

@CrossOrigin
@GetMapping("/all")
@ResponseBody
public List<Menu> getMenus() {
    return (List<Menu>) menuService.findAll().stream()
             .filter (menu-> Objects.isNull(menu.getParent()).collect(Collectors.toList()));
}
@Autowired
私有MenuService MenuService;
@交叉起源
@GetMapping(“/all”)
@应答器
公共列表getMenus(){
return(List)menuService.findAll().stream()
.filter(menu->Objects.isNull(menu.getParent()).collect(collector.toList());
}
输出:


谢谢。

Jackson提供了这些注释来控制父子关系

@JsonBackReference:在序列化过程中跳过属性

@JsonManagedReference:正向引用和序列化的带注释属性

在您的情况下,您不希望在子引用中序列化父对象,您可以使用
@JsonBackReference

@JsonManagedReference
@OneToMany(mappedBy = "parent")
private Set<Menu> children;

@ManyToOne
@JsonBackReference
private Menu parent;

Jackson
提供这些注释来控制父子关系

@JsonBackReference:在序列化过程中跳过属性

@JsonManagedReference:正向引用和序列化的带注释属性

在您的情况下,您不希望在子引用中序列化父对象,您可以使用
@JsonBackReference

@JsonManagedReference
@OneToMany(mappedBy = "parent")
private Set<Menu> children;

@ManyToOne
@JsonBackReference
private Menu parent;

它可以工作,但结果中有一个小问题[{“id”:7,“url”:“description”:“main menu 1”,“qrCode”:null,“children”:[{“id”:9,“url”:“url…”“url…”,“children menu 2”,“qrCode”:null,“children”:[]},{“id”:8,“url”:“url…”,“description”:“children menu 1”,“qrCode”:null,“children”:[]},{“id”:8,“url”:“url…”,“描述”:“子菜单1”,“qrCode”:null,“子菜单”:[]},{“id”:9,“url”:“url…”,“描述”:“子菜单2”,“qrCode”:null,“子菜单”:[]}]id=7及其两个子项检索正常。但问题是子项也显式进入结果。无法使用StringUtils.isBlank方法。它将从何处导入?
Objects.isNull(menu.getParent()).collect(Collectors.toList());
出现错误:无法调用collect(Collectors.toList())在基本类型booleanit上可以工作,但结果[{“id”:7,“url”:“,”description:“main menu 1”,“qrCode”:null,“children:”:[{“id”:9,“url:”,“url:”,“description:”:“child menu 2”,“qrCode”:null,“children:[]},{“id”:8,“url:“url:”url…,“description:“child menu 1”,“qrCode”:null,“children:”[]},{“id”:8,“url”:“url…”,“描述”:“子菜单1”,“qrCode”:null,“子菜单”:[]},{“id”:9,“url”:“url…”,“描述”:“子菜单2”,“qrCode”:null,“子菜单”:[]}]id=7及其两个子项检索正常。但问题是子项也显式进入结果。无法使用StringUtils.isBlank方法。它将从何处导入?
Objects.isNull(menu.getParent()).collect(Collectors.toList());
出现错误:无法调用collect(Collectors.toList())关于本原型布尔