[英]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_ID
, DEPARTMENT_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.