Spring boot 如何在运行时启用/禁用实体关系?

Spring boot 如何在运行时启用/禁用实体关系?,spring-boot,spring-data-jpa,spring-data,spring-data-rest,Spring Boot,Spring Data Jpa,Spring Data,Spring Data Rest,我有一个Spring Boot应用程序,它有基本的CRUD服务。对于阅读服务,我也希望看到它们之间的关系。通过@ManyToOne、@OneToOne等实现关系没有问题。注释如示例所示 我的问题是我想基于列表服务中的参数启用这种关系,或者我也可以使用另一个端点。我怎样才能做到这一点?欢迎提出任何建议 参数版本可能类似-> /员工/列表?includeRelations=true 端点版本可能类似-> /员工/名单/关系 我的实体就像 @Entity @Table(name =

我有一个Spring Boot应用程序,它有基本的CRUD服务。对于阅读服务,我也希望看到它们之间的关系。通过@ManyToOne、@OneToOne等实现关系没有问题。注释如示例所示

我的问题是我想基于列表服务中的参数启用这种关系,或者我也可以使用另一个端点。我怎样才能做到这一点?欢迎提出任何建议

  • 参数版本可能类似-> /员工/列表?includeRelations=true
  • 端点版本可能类似-> /员工/名单/关系
我的实体就像

    @Entity
    @Table(name = "employee")
    public class Employee{
        private long id;
        private String name;
        private Address address;
        
        // getter setters
    }
    
    @Entity
    @Table(name = "address")
    public class Address {
        private long id;
        private String name;
        private String postalCode;
    
        // getter setters
    }
编辑 e、 g

  • 如果没有includeRelations=true,“/employee/list”服务应返回此信息
  • includeRelations=true时,“/employee/list”服务应返回此信息

这是一些供您理解的
sudo
代码。您可以使用
查询参数
,在您需要调用回购的情况下: 对于我的场景,我需要不同的响应
short
medium
long

@RequestMapping(value=“/getContacts”,method=RequestMethod.POST,products=MediaType.APPLICATION\u JSON\u value,headers=“Accept=APPLICATION/JSON”) 公共字符串getContact(@RequestBody ContactItemRequestInfo ContactItemRequestInfo, @RequestParam(必需=false)字符串键, (串触点) {

}
这对你会有帮助的

其中一种方法是根据REST请求返回不同的数据传输对象

假设除了实体之外,还有以下类

class EmployeeDto {
  private Long id;
  private String name;
}

class EmployeeAddressDto {
  private Long id;
  private String name;
  private AddressDto address;
}

class AddressDto {
  private Long id;
  private String name;
  private int postalCode;
}
然后在控制器中,你会做这样的事情

@GetMapping("/employee/list")
public ResponseEntity<?> getEmployees(@RequestParam int detailed) {

  if (detailed) {
    return employeeService.getDetailedEmployeeList();
  } else {
    return employeeService.getEmployeeList();
  }
}
interface EmployeService() {

  List<EmployeeDto> getEmployeeList();

  List<EmployeeAddressDto> getDetailedEmployeeList();
}
@GetMapping(“/employee/list”)
公共响应getEmployees(@RequestParam int detailed){
如有(详情){
返回employeeService.getDetailedEmployeeList();
}否则{
返回employeeService.getEmployeeList();
}
}
服务接口看起来是这样的

@GetMapping("/employee/list")
public ResponseEntity<?> getEmployees(@RequestParam int detailed) {

  if (detailed) {
    return employeeService.getDetailedEmployeeList();
  } else {
    return employeeService.getEmployeeList();
  }
}
interface EmployeService() {

  List<EmployeeDto> getEmployeeList();

  List<EmployeeAddressDto> getDetailedEmployeeList();
}
interface employeeservice(){
List getEmployeeList();
List getDetailedEmployeeList();
}

您还需要处理实体来传输对象转换。

您可以使用fetchType=Lazy注释关系。然后调用getter手动加载所需的关系。
另一种选择是急切地加载所有关系,但用@JsonView注释响应并排除不需要的关系。

仍然不清楚。你所说的启用这种关系是什么意思?给出场景。@krishnkantjaiswal我已经添加了一个示例。如果还不清楚,请告诉我。
interface EmployeService() {

  List<EmployeeDto> getEmployeeList();

  List<EmployeeAddressDto> getDetailedEmployeeList();
}