【问题标题】:Spring-JPA - How to output limited fields from Self Joined tablesSpring-JPA - 如何从自联接表中输出有限字段
【发布时间】:2019-04-05 09:51:05
【问题描述】:

我有一个名为employee 的实体,它自己加入。联接是代表谁是该员工的经理。当我查询记录时,我得到了员工的整个层次结构。

我希望实现的是只获取经理的几个字段,而不希望获取员工经理的经理。

我尝试使用@NamedEntityGraph 执行此操作,但无法获得预期的输出。 也使用了Projections

我也尝试过这里提到的方法

  1. JPA Self Join using JoinTable

  2. Self join Spring JPA

注意 - 我不想使用@Query 注释

@Entity
public class Employee {
    @Id
    @Column(name = "employeeId", nullable = false)
    private String employeeId;

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

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

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

    @Column(name = "dateOfJoining", nullable = false)
    private LocalDate dateOfJoining;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "line_manager_id")
    private Employee manager;

}

实际结果 -

{
   "firstName":"Super",
   "lastName":"Manager",
   "middleName":"",
   "dateOfJoining":"2012-12-31",
   "manager":{
      "firstName":"Super",
      "lastName":"Manager",
      "middleName":"",
      "dateOfJoining":"2012-12-31",
      "manager":{
         "firstName":"Admin",
         "lastName":"User",
         "middleName":"",
         "dateOfJoining":"2012-12-31",
         "manager":{
            "firstName":"Admin",
            "lastName":"User",
            "middleName":"",
            "dateOfJoining":"2012-12-31",
            "manager": null,
            "employeeId":"P67"
         },
         "employeeId":"P68"
      },
      "employeeId":"P69"
   },
   "employeeId":"P70"
}

预期结果


{
   "firstName":"Super",
   "lastName":"Manager",
   "middleName":"",
   "dateOfJoining":"2012-12-31",
   "manager":{
      "firstName":"Super",
      "lastName":"Manager",
      "employeeId":"P69"
   },
   "employeeId":"P70"
}

【问题讨论】:

  • 您是否尝试将@NamedQuery 用于您的Employee 类?
  • 对不起@Abhinav,我强烈建议不要使用@Query@NamedQuery 来解决这个问题
  • 好的!没问题,您是否尝试使用 JPA 的 createQuerycreateNativeQuery 方法,将 query 作为参数传递?

标签: java hibernate spring-data-jpa


【解决方案1】:

您应该在不想被包含的字段中使用@JsonIgnore 注释。查看herehere 了解更多信息。

【讨论】:

  • 这不会阻止任何东西被获取;另外,这将如何导致只有一级经理(而不是零级或全部)?
  • 这就是为什么我添加了两个额外的链接,以便他可以搜索并找到适当的配置来实现它。
  • 嗨@ΣωτήρηςΡαφαήλ 我确实查看了您指出的链接。 @JsonIgnore 完全覆盖了直线经理。 @JsonManagedReference, @JsonBackReference 也不能解决我的问题。它们将作用于两个不同的实体,而不是作用于与其自身连接的同一个实体。
  • @AashirwadGupta 你可以创建一个响应对象,你将只用你想要返回的信息填充它。
【解决方案2】:

尝试使用延迟加载

@ManyToOne(fetch=FetchType.LAZY)

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多