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.
spróbuj zrobić to w dwóch etapach ... – aurelius
czy próbowałeś z 'JOIN FETCH' zamiast' LEFT JOIN FETCH'? – Syl