2016-09-01 10 views
7

PodsumowanieW Hibernate HQL, jak mogę pozostawić dołączyć pobrać podklasę "połączonych podmiotów, gdy wiele podklas ma właściwość o tej samej nazwie?

W Hibernate, staram się LEFT JOIN FETCH właściwości z podklas klasy głównej, gdzie liczne podklasy mają właściwości o tej samej nazwie. Hibernate jednak pobiera tylko pierwszą podklasę "połączone obiekty, a nie pozostałe.

Tło

mam możliwości modelowania genomu (genów, transkryptów i eksony) i warianty genetyczne w systemie opartym na Hibernate. Geny, transkrypty i egzony to wszystkie podklasy GenomicFeature, a warianty mogą mieć zero-do-wielu cech genomowych. Geny z kolei mają transkrypty zero-do-wielu - podobnie jak Exons - i transkrypty mają zero-do-wielu genów i eksonów. Każda z tych relacji jest leniwy. Czasami jednak chcę pobrać wariant i wszystkie jego cechy genomiczne, a także wszystkie cechy genomiczne powiązane z bezpośrednimi cechami genomicznymi. Np. Chcę pobrać konkretny wariant, geny/transkrypty/egzony powiązane z wariantem, wszystkie transkrypty genów, wszystkie geny & egzony transkryptów i wszystkie transkrypcje egzonów.

Problem

Kiedy zrobić zapytanie do powyższego, z wyjątkiem, że to działa transkryptów dla genów nie są pobierane, Stenogramy only eksonie są naciągane. Zakładam, że dzieje się tak, ponieważ właściwość - gen.transcripts i exon.transcripts - ma tę samą nazwę.

Co Próbowałem

Zapytanie głównym, w PagingAndSortingRepository jest poniżej

@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); 

Próbowałem łączenia genomicFeature dwa razy, raz na geny i raz na transkryptów & eksonów, ale to nie działa.

Próbowałem tylko wybierając Geny (WHERE TYPE(gf) = Gene), ale patrząc na zapytanie, które generuje, nadal łączy tylko Exon's Transcripts, a następnie zwraca Geny.

+0

spróbuj zrobić to w dwóch etapach ... – aurelius

+0

czy próbowałeś z 'JOIN FETCH' zamiast' LEFT JOIN FETCH'? – Syl

Odpowiedz

0

Nie próbowałem siebie, ale może przy pomocy aliasu na klauzulach pobierania może pomóc Hibernate w rozróżnianiu pól?

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

Wymyśliłem to. Po prostu działa. Miałem błąd składniowy w moim HQL.

Gdy podklasa dyskryminowana ma właściwości/kolumnę, które nie znajdują się w klasie głównej, wszystkie właściwości wszystkich podklas distriminator są dostępne w HQL przy użyciu klasy głównej w instrukcji FROM.

Powiązane problemy