[英]JPA Hibernate SQL Query to NOT fetch data from one of the associated tables
我正在尝试使用 JPA 查询使用以下查询从数据库中获取数据:
from Candidate c where c.id = :id
其中,id =Candidate_id(主表的主键)。
此查询也从其所有关联的表中获取数据,而我的要求是仅从其关联的 2 个表中获取数据。 因为第三个表包含大量 JSON 数据,这会降低上述查询的响应时间。
我尝试使用JOIN , Fetch JOIN of parent 及其 2 个关联表,但没有用。 我也在研究如何在获取候选数据时只跳过一列数据(带有大量 JSON 的第三个表的列)但没有运气。
是否可以使用 JPA 查询来实现它,或者我需要尝试其他方法? 我很repo.save(candidate)
使用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)
应当在附图中获取候选总是空图
您在这里需要的是 DTO,我认为这是Blaze-Persistence Entity Views的完美用例。
我创建了该库以允许在 JPA 模型和自定义接口或抽象类定义的模型之间轻松映射,例如类固醇上的 Spring Data Projections。 这个想法是您按照自己喜欢的方式定义目标结构(域模型),并通过 JPQL 表达式将属性(getter)映射到实体模型。
使用 Blaze-Persistence Entity-Views 的用例的 DTO 模型可能如下所示:
@EntityView(Candidate.class)
public interface CandidateDto {
@IdMapping
Long getId();
String getName();
AddressDto getAddress();
Set<SkillsDto> getSkills();
@EntityView(Address.class)
interface AddressDto {
@IdMapping
Long getId();
String getName();
}
@EntityView(Skills.class)
interface SkillsDto {
@IdMapping
Long getId();
String getName();
}
}
查询是将实体视图应用于查询的问题,最简单的只是按 id 查询。
CandidateDto a = entityViewManager.find(entityManager, CandidateDto.class, id);
Spring Data 集成允许您几乎像 Spring Data Projections 一样使用它: https : //persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
Page<CandidateDto> findAll(Pageable pageable);
最好的部分是,它只会获取实际需要的状态!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.