当前位置: 首页 > 知识库问答 >
问题:

JPA Hibernate SQL查询不从一个关联表中提取数据

谭京
2023-03-14

我正在尝试使用JPA查询使用以下查询从DB中获取数据:

from Candidate c where c.id = :id

其中,id=candidate_id(主表的主键)。

该查询也从其所有关联表中获取数据,而我的要求是仅从其2个关联表中获取数据。因为第三个表包含大量JSON数据,这会降低上述查询的响应时间。

我尝试使用JOIN,获取父级的JOIN及其2个关联表,但它不起作用。我还在研究如何在获取候选数据时只跳过一列数据(带有大量JSON的第3个表的列),但运气不好。

可以使用JPA查询实现吗?或者我需要尝试其他方法?我可以使用repo一次性保存候选表及其所有相关表数据。保存(候选),但不想获取其中一个相关表数据。

这就是我在spry-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)在附在图中的已获取候选项中应始终为null

共有1个答案

仉俊能
2023-03-14

这里需要的是DTO,我认为这是Blaze持久性实体视图的完美用例。

我创建了这个库,允许JPA模型和自定义接口或抽象类定义模型之间的轻松映射,就像类固醇上的Spring数据投影一样。这个想法是,您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

使用Blaze Persistence实体视图,用例的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进行查询。

<代码>候选a=entityViewManager。find(entityManager,CandidateDto.class,id)

Spring Data集成允许您使用它几乎像Spring数据投影:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

Page<CandidateDto> findAll(Pageable pageable);

最好的部分是,它只会获取实际需要的状态!

 类似资料:
  • 问题内容: 我正在尝试一次从三个表中检索数据。这些表如下所示: 类别 讯息 评论 我想要得到的是1条消息(因为我有一个基于id的子句),3个类别(因为有3个类别链接到消息)和2条注释(因为有2条注释链接到消息)。 我正在尝试使用以下查询来检索数据: 但是,当运行此查询时,我得到6个结果: 在我预期结果如下的地方: 只有三行,我应该能够获取所有需要的数据。这有可能吗?我做错了吗?? 问题答案: 如评

  • 我想这样写一个hql 因为我是新手,请帮帮我

  • 我选择两个id列,但指定错误: 一些代码: 如何修复错误,我做错了什么?

  • 问题内容: 我正在选择两个id列,但指定了错误: 一些代码: 如何解决错误,我在做什么错? 问题答案: 使用常规而不是(顺便说一句,默认情况下): 正如错误消息告诉您的那样,在这里没有意义,因为它是一种性能提示,会迫使人们急切加载收藏。

  • 我去研究了关于JPA2.1规范的信息,这就是我发现的: 用于联接的联接条件来自映射的联接列。这意味着JPQL用户通常不必知道每个关系是如何连接的。在某些情况下,需要在连接条件中附加附加条件,通常是在外部连接的情况下。这可以通过ON子句来实现。ON子句在JPA2.1规范中定义,某些JPA提供程序可能支持ON子句。EclipseLink:Hibernate:TopLink-支持ON子句。 需要注意的是