Spring-JPA - Как вывести ограниченные поля из таблиц Self Joined - PullRequest
1 голос
/ 05 апреля 2019

У меня есть сущность по имени сотрудник, которая сама присоединяется к себе. Объединение должно представлять, кто является менеджером этого сотрудника Когда я запрашиваю записи, я получаю всю иерархию для сотрудника.

Чего я хочу добиться - это выбрать только несколько полей менеджера и не желать получать менеджера менеджера сотрудника.

Я пытался сделать это, используя @NamedEntityGraph, но не смог получить ожидаемый результат. Используется также Projections.

Я также попробовал подход, упомянутый здесь

  1. Самостоятельное присоединение JPA с использованием JoinTable

  2. Самостоятельное соединение пружин 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"
}

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вы должны использовать аннотацию @JsonIgnore в полях, которые вы не хотите включать. Проверьте здесь и здесь для получения дополнительной информации.

0 голосов
/ 05 апреля 2019

попробуйте использовать ленивый груз

@ManyToOne(fetch=FetchType.LAZY)
...