我对 Java Springboot 框架非常陌生。我遵循了几个教程,发现每次向服务器发出 HTTP 请求时,JpaRepository 都会返回实体及其所有映射关系。
这是代码
@Table(name = "provinces")
public class Province {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "province_id")
private List<City> cities;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "province_id")
private List<PreRelease> preReleases;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "province_id")
private List<Project> projects;
}
@Table(name = "cities")
public class City {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "province_id")
private Province province;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "city_id")
private List<Project> projects;
}
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Integer id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "province_id")
private Province province;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "city_id")
private City city;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "pre_release_id")
private PreRelease preRelease;
}
我的问题是:JpaRepository可以动态加载关系数据吗?有时我确实想要它的映射关系,有时我不想要它的映射关系数据。
任何帮助将不胜感激!
首先。仅当您尝试访问相关实体时才会加载它们,因为您在关系中定义了
fetch = FetchType.LAZY
此外,这取决于你所说的关系是什么意思。如果你的意思是你只想加载相关实体的id而不是整个实体,我会建议这样的东西(自JAVA 17起重要记录可用):
@Query(SELECT new com.baeldung.jpa.records.ProjectRecord(p.id, p.province.id, p.city.id, p.preRelease.id) FROM Project p WHERE b.id = :id")
ProjectRecord findProjectById(@Param("id") Long id);
在存储库中使用此注释,仅选择 ids 并将其写入单独的模型,因此它不会加载所有相关实体。如果这不起作用,可以尝试在 @Query 中使用 nativeQuery=true 并从 JPQL 查询切换到本机 SQL :)
正如@Thomas Meyer 在他的回答中提到的,你已经定义了
fetch=FetchType.LAZY
这确保仅在需要时而不是始终获取这些数据。
您也可以使用
@JsonIgnore
关于从数据库获取数据时要忽略的属性。
例如:
@Table(name = "cities")
public class City {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "province_id")
private Province province;
@JsonIgnore //To ignore projects while fetching the data
@OneToMany
@JoinColumn(name = "city_id")
private List<Project> projects;
}
或者,
正如 @Thomas Meyer 的答案中提到的,您可以使用 Jpql 在存储库中使用自定义方法创建方法。