弹簧关系获取没有负载子类的孩子ID

时间:2018-12-20 06:49:46

标签: java spring jpa

如何在Spring Boot JPA中不加载子类的情况下获取基类的DEPARTMENT_ID

例如,我们有一个基本模型:

@Entity
@Table(name = "TM_POSITIONS")
public class PositionEntity {

    @Id
    @SequenceGenerator(name = "PositionsSequence", sequenceName = "TM_POSITIONS_SEQ", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PositionsSequence")
    private long id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "DEPARTMENT_ID")
    private DepartmentModel department;
...

因此,如何仅获取DEPARTMENT_ID而不将其捆绑并加载另一个对象。在某些情况下,我需要获取相关的模型,在某些情况下,仅需要获取DEPARTMENT_ID。

2 个答案:

答案 0 :(得分:3)

您可以为此创建一个responseDTO类和一个映射器类。

@ApiModel
public class positionEntityResponseDTO{

private long id;
private long departmentId;

//getter & setter

}

映射器类如下

 @Service
    public class ResponseMapper{
     public positionEntityResponseDTO map (PositionEntity entity){
       positionEntityResponseDTO response = new positionEntityResponseDTO();
        response.setId(entity.getId);
        response.setDepartmentId(entity.getDepartment.getId();
        return response;

    }

    }

现在假设您在某个地方写信

@Autowired
private ResponseMapper mapper;
positionEntityResponseDTO response= mapper.map(repository.save(entity));

现在您只能通过DEPARTMENT_ID对象传递response。希望这对您有用。

答案 1 :(得分:1)

首先,您需要设置fetch = FetchType.LAZY。以EAGER方式将始终加载子类。

如果将抓取类型设置为惰性,则无需额外的数据库查询就可以访问子类的id(主键)字段。

因此,如果您输入position.getDepartment().getId(),则将获得ID,并且不会花费任何费用。

请记住,子类上的其他方法调用将从数据库中加载,例如:toString,equals或getName()/如果存在这样的方法/。

如果您需要子类来实现某些其他功能,则应该在存储库中编写另一个查询,该查询也将获取子类。

@Query("SELECT pos FROM Position LEFT JOIN FETCH pos.department")

使用JOIN FETCH的Spring Data JPA将生成一个查询,该查询将连接两个表,因此可以避免N+1问题。