摘要
在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。
我想到了。它只是有效。我的HQL中出现语法错误。
当有区别的子类具有不在根类中的属性/列时,在FROM语句中使用根类时,可以在HQL中访问所有分布器子类的所有属性。
我没有尝试过自己,但也许在fetch子句上使用别名可以帮助Hibernate区分字段?
LEFT JOIN FETCH gf.genes as g
LEFT JOIN FETCH gf.exons as e
LEFT JOIN FETCH gf.transcripts as t