2016-09-01 69 views
7

摘要在Hibernate HQL中,當多個子類有一個屬性名稱相同的屬性時,如何讓連接獲取子類的鏈接實體?

在Hibernate中,我試圖LEFT JOIN從一個主類,其中多個子類具有相同名稱的屬性的子類取得屬性。然而,Hibernate只提取第一個子類的鏈接實體,而不是其他實體。

背景

我造型基因組特徵(基因,轉錄和外顯子),並在基於Hibernate的系統的遺傳變異。基因,轉錄本和外顯子都是GenomicFeature的子類,Variants可以具有零到多個GenomicFeatures。反過來,基因也具有零對多的轉錄本 - 外顯子 - 以及轉錄本具有零對多的基因和外顯子。這些關係中的每一個都是懶散地取得的。但有時候,我想獲取變體及其所有基因組特徵,以及從直接基因組特徵鏈接的所有基因組特徵。例如,我想獲取特定的變體,與變體相關的基因/轉錄本/外顯子,基因的所有轉錄本,轉錄本的所有基因外顯子以及外顯子的所有轉錄本。

問題

當我在上面做一個查詢,它的工作原理不同之處在於對基因轉錄並不牽強,只是外顯子的轉錄牽強。我認爲這是因爲屬性 - 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兩次,一次用於基因和一次成績單&外顯子,但這不起作用。

我試過只選擇基因(WHERE TYPE(gf) = Gene),但看着它生成的查詢,它仍然只加入外顯子的轉錄本,然後返回基因。

+0

嘗試在兩個步驟中完成它... – aurelius

+0

您嘗試使用'JOIN FETCH'而不是'LEFT JOIN FETCH'嗎? – Syl

回答

0

我沒有嘗試自己,但也許與別名上取得子句可以幫助Hibernate區分字段?

LEFT JOIN FETCH gf.genes as g 
LEFT JOIN FETCH gf.exons as e 
LEFT JOIN FETCH gf.transcripts as t 
2

我想通了。它只是工作。我在我的HQL中有一個語法錯誤。

當區分子類具有不在根類中的屬性/列時,在使用FROM語句中的根類時,HQL中可以訪問所有分佈器子類的所有屬性。

相關問題