繁体   English   中英

JPA Hibernate SQL 查询不从关联表之一获取数据

[英]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 数据,这会降低上述查询的响应时间。

我尝试使用JOINFetch 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM