【问题标题】:Spring data JPA self join on an entity. How do I specify the depth of recursion?实体上的 Spring 数据 JPA 自联接。如何指定递归深度?
【发布时间】:2020-08-21 01:21:39
【问题描述】:

使用 Spring Boot JPA,我正在使用属性 id、name 和 parent_id 对“Person”表进行自联接。 parent_id 是引用 Person.id 的外键。因此,一个 Person 将有零个或一个父级。下面是我的域类的示例。

@Entity(name="person")
public class Person {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="parent_person_id")
    private Person parent;

    // constructors, getters, setters, etc
}

这实际上工作得很好;例如,当我使用 CrudRepository.findById() 查询时,我得到一个带有嵌入 Person 对象(父对象)的 Person 对象,该对象可能有另一个嵌入的 Person 对象(祖父对象)等,直到我得到一个没有父对象的 Person。

我的问题是,我怎样才能只检索一个 Person 及其直系父母而不进一步递归(没有祖父母、曾祖父母等)?

我想我可以简单地避免加入,并让 parent_id 成为一个普通的@Column,然后在服务层做一个额外的查询来找到父级,但我想知道是否有一些 Jpa 魔法可以让它更容易比那个。

【问题讨论】:

  • 你的意思是在 JSON 结果中有无限循环吗?
  • 不,它工作得很好——但我只想递归一层。只是父级,没有更多。
  • 我明白,但你是如何返回对象的?这是休息api吗?或者您在System.out.println() 中遇到了toString() 的问题。
  • 有没有试过在join栏里加referencedColumnName
  • 当你打电话给 parent 时究竟发生了什么?如果您在序列化过程中遇到问题,parent 上的 @JsonIgnoreProperties({ "parent" }) 字段应该可以工作

标签: spring-boot spring-data-jpa


【解决方案1】:

实际上,这并不像看起来那么难。将我的 Person 实体转换为 dto 让我有机会简单地在父级处停止,而不是在整个树中递归!

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多