如何在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。

最佳答案

首先,您需要设置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问题。

07-26 05:12