【发布时间】:2022-01-24 07:46:23
【问题描述】:
我有 2 个具有双向一对多关系的实体(部门、员工)。
1个部门有很多员工。
Department 拥有 Employee
我用@JsonIgnore 注释了department 字段,这样当我GET localhost:8080/employee 时Department 信息不会被序列化
我创建了一个自定义查询来公开Employee 的所有信息,包括员工所属的Department。
部门型号
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String departmentName;
@OneToMany(mappedBy = "department")
private Set<Employee> employees;
...
}
员工模型
@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 编辑器中运行良好。 DEPARTMENT_ID, DEPARTMENT_NAME 如果我执行GET localhost:8080/employee/1,则会包含信息
但是,在 Postman 中,我只能获得 Employee 信息(id、名字、姓氏、中间名)。 Employee 所属的 Department 没有被映射/序列化(因为我在 Employee 类中使用了 @JsonIgnored)。
{
"id": 1,
"firstName": "John",
"middleName": "Doe",
"lastName": "Johnny"
}
如果我将findEmployeeByIdWithDepartment的返回类型更改为Object,我可以获得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,我不确定如何显示Department 信息和Employee 信息
和
仍然可以毫无问题地执行GET localhost:8080/department。
如果department 字段 IN Employee 类中没有 @JsonIgnore,Json 响应将导致 StackOverflow 或 Endless 嵌套序列化问题。
谢谢。
【问题讨论】:
-
为什么要在查询中单独获取 d.department_name?尝试获取 e.* 并将返回类型设置为 Employee 而不是 Object。您可以访问 Employee.getDepartment 然后获取部门字段中的名称和其余字段
标签: java spring hibernate spring-data-jpa jackson