【发布时间】:2021-11-22 21:35:08
【问题描述】:
我正在尝试使用 JPA 查询使用以下查询从数据库中获取数据:
from Candidate c where c.id = :id
其中,id = Candidate_id(主表的主键)。
此查询也从其所有关联表中获取数据,而我的要求是仅从其关联表中的 2 个中获取数据。因为第三张表包含大量 JSON 数据,这会降低上述查询的响应时间。
我尝试使用 JOIN、Fetch JOIN 的父级及其 2 个关联表,但没有成功。我还在研究如何在获取候选数据时只跳过一列数据(第三个表的列,JSON 很重),但没有运气。
是否可以使用 JPA 查询来实现它,或者我需要尝试其他方法?我很高兴使用repo.save(candidate) 一次性保存候选人及其所有相关表数据,但不想获取相关表数据之一。
这就是我在 spring-boot 中建立关联的方式:
候选实体:
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
mappedBy = "candidate")
@JsonManagedReference
private Address address;
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
mappedBy = "candidate")
@JsonManagedReference
private Set<Skills> skills= new HashSet<>();
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
mappedBy = "candidate")
@JsonManagedReference
private Set<Prefrence> prefrences = new HashSet<>();
地址实体:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "candidate_id")
@JsonBackReference
private Candidate candidate;
技能实体:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "candidate_id")
@JsonBackReference
private Candidate candidate;
//rest of the fields
偏好实体:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "candidate_id")
@JsonBackReference
private Candidate candidate;
//rest of the fields
我不想在使用 candidateRepo.findById(id) 时获取 Preference 实体数据在获取的 Candidate 中应该始终为 null
附上图
diagram
【问题讨论】:
-
如果它不应该被获取,你为什么要映射它?
-
@SimonMartinelli,我将其映射为一次将候选人的数据保存在所有关联表中。即 repo.save(candidate).
-
您的要求与 JPA 的工作方式不匹配。
-
好的..你的意思是如果我们通过映射保存数据,那么它会带回数据以及一切......是吗?没有 JPA 查询可以帮助我
-
这就是它的工作方式。您已将获取类型设置为惰性,但候选对象将包含一个代理,如果您访问该属性,该代理将触发加载
标签: java spring-boot hibernate jpa