在Hibernate HQL中,当多个子类具有相同名称的属性时,如何保持连接获取子类的链接实体?

问题描述 投票:6回答:2

摘要

在Hibernate中,我试图从主类的子类LEFT JOIN FETCH属性,其中多个子类具有相同名称的属性。但是,Hibernate只获取第一个子类的链接实体,而不是其他实体。

背景

我正在基于Hibernate的系统中对基因组特征(基因,转录本和外显子)和遗传变异进行建模。基因,转录本和外显子都是GenomicFeature的子类,变体可以各自具有零对多基因组特征。反过来,基因具有零到多的转录本 - 外显子也是如此 - 而转录本具有零对多的基因和外显子。这些关系中的每一个都是懒洋洋地获取的。但有时,我想获取变体及其所有基因组特征,以及从直接基因组特征相关的所有基因组特征。例如,我想获取一个特定的变体,与变体相关的基因/转录物/外显子,基因的所有转录物,转录物的所有基因和外显子,以及外显子的所有转录物。

问题

当我对上述内容进行查询时,它的工作原理除了不提取基因的转录本,只提取外显子的转录本。我假设这是因为属性 - gene.transcripts和exon.transcripts - 共享相同的名称。

我试过的

PagingAndSortingRepository中的主要查询如下所示

    @Query("SELECT v FROM Variant v"
        + " LEFT JOIN FETCH v.variantGenomicFeatures AS vgf"
        + " LEFT JOIN FETCH vgf.genomicFeature AS gf LEFT JOIN FETCH gf.genes LEFT JOIN FETCH gf.exons LEFT JOIN FETCH gf.transcripts"
        + " WHERE"
        + "     v.id = (:id)")
public Variant findOneByIdAndGenomicFeaturesEagerly(@Param("id") Integer id);

我尝试过两次加入genomicFeature,一次用于基因,一次用于转录和外显,但这不起作用。

我曾尝试过只选择Genes(WHERE TYPE(gf) = Gene),但看看它生成的查询,它仍然只加入Exon的Transcripts,然后返回Genes。

java hibernate
2个回答
2
投票

我想到了。它只是有效。我的HQL中出现语法错误。

当有区别的子类具有不在根类中的属性/列时,在FROM语句中使用根类时,可以在HQL中访问所有分布器子类的所有属性。


0
投票

我没有尝试过自己,但也许在fetch子句上使用别名可以帮助Hibernate区分字段?

LEFT JOIN FETCH gf.genes as g 
LEFT JOIN FETCH gf.exons as e 
LEFT JOIN FETCH gf.transcripts as t
© www.soinside.com 2019 - 2024. All rights reserved.