【问题标题】:Spring JPA Exposing/Mapping @JsonIgnore fields from an associated Entity using custom query @QuerySpring JPA使用自定义查询@Query从关联实体中公开/映射@JsonIgnore字段
【发布时间】:2022-01-24 07:46:23
【问题描述】:

我有 2 个具有双向一对多关系的实体(部门、员工)。 1个部门有很多员工。 Department 拥有 Employee

我用@JsonIgnore 注释了department 字段,这样当我GET localhost:8080/employeeDepartment 信息不会被序列化

我创建了一个自定义查询来公开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


【解决方案1】:

您可以为 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();
    }

    ...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2013-11-22
    • 2021-09-02
    • 2023-03-18
    • 2013-01-22
    相关资源
    最近更新 更多