簡體   English   中英

Spring JPA 使用自定義查詢 @Query 從關聯實體公開/映射 @JsonIgnore 字段

[英]Spring JPA Exposing/Mapping @JsonIgnore fields from an associated Entity using custom query @Query

我有 2 個具有雙向一對多關系的實體(部門、員工)。 1個部門有很多員工。 Department擁有Employee

我用@JsonIgnore注釋了department字段,以便在我GET localhost:8080/employee時不會序列化Department信息

我創建了一個自定義查詢來公開Employee的所有信息,包括員工所屬的Department

部門Model

@Entity
public class Department {

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

    private String departmentName;

    @OneToMany(mappedBy = "department")
    private Set<Employee> employees;
   ...
}

員工Model

@Entity
public class Employee {

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

    private String firstName;
    private String middleName;
    private String lastName;

    @ManyToOne
    @JsonIgnore
    private Department department;
    ...
}

存儲庫

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query(value = "SELECT e.*, d.department_name FROM Employee e INNER JOIN Department d ON e.department_id = d.id WHERE e.id = ?1", nativeQuery = true)
    Employee findEmployeeByIdWithDepartment(Long employeeId);
}

該查詢在 H2-Console SQL 編輯器中運行良好。 如果我執行GET localhost:8080/employee/1 ,則會包含DEPARTMENT_IDDEPARTMENT_NAME信息

在此處輸入圖像描述

但是,在 Postman 中,我只獲取Employee信息(id、firstname、lastname、middlename)。 Employee所屬的Department沒有被映射/序列化(因為我在Employee類中使用@JsonIgnored )。

{
    "id": 1,
    "firstName": "John",
    "middleName": "Doe",
    "lastName": "Johnny"
}

如果我將Object findEmployeeByIdWithDepartment我可以獲得Employee信息以及員工所屬的Department

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query(value = "SELECT e.*, d.department_name FROM Employee e INNER JOIN Department d ON e.department_id = d.id WHERE e.id = ?1", nativeQuery = true)
    Object findEmployeeByIdWithDepartment(Long employeeId);
}

結果:(不是嵌套Department信息的所需 JSON 格式)

[
    1,
    "John",
    "Johnny",
    "Doe",
    1,
    "Accounting"
]

如果我執行GET localhost:8080/employee/1並且仍然能夠毫無問題地執行GET localhost:8080/department ,我不確定如何能夠顯示Department信息和Employee信息。

如果department字段 IN Employee class 中沒有@JsonIgnore ,則 Json 響應將導致 StackOverflow 或 Endless 嵌套序列化問題。

謝謝你。

您可以為 Employee 中的 Depertment-properties 編寫 getter,例如

@Entity
public class Employee {

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

    private String firstName;
    private String middleName;
    private String lastName;

    @ManyToOne
    @JsonIgnore
    private Department department;

    @JsonProperty("departmentId")
    public Long getDepartmentId()
    {
        return department.getId;
    }

    @JsonProperty("departmentName")
    public String getDepartmentName()
    {
        return department.getName();
    }

    ...

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM