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