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