2016-09-01 8 views
7

Tóm tắtTrong Hibernate HQL, làm cách nào để tôi tham gia tìm nạp các thực thể được liên kết của lớp con khi nhiều lớp con có thuộc tính có cùng tên?

Trong Hibernate, tôi đang cố gắng để LEFT JOIN FETCH tính từ lớp con của một lớp học chính, nơi nhiều lớp con có đặc tính có cùng tên. Mặc dù vậy, Hibernate chỉ tìm nạp các thực thể được liên kết của lớp con đầu tiên chứ không phải các thực thể khác.

nền

Tôi đang mô hình hóa tính năng di truyền (gen, bảng điểm và exon) và các biến thể di truyền trong một hệ thống Hibernate-based. Gen, bảng điểm và Exons là tất cả các lớp con của GenomicFeature, và các biến thể có thể có nhiều genomicFeatures từ 0 đến nhiều. Gen, lần lượt, có các bảng điểm từ 0 đến nhiều - cũng như Exons - và Bảng điểm có từ 0 đến nhiều gen và Exon. Mỗi mối quan hệ này đều bị lười biếng. Đôi khi, mặc dù, tôi muốn lấy một biến thể và tất cả các tính năng di truyền của nó, cũng như tất cả các tính năng di truyền được liên kết từ các tính năng di truyền ngay lập tức. Ví dụ, tôi muốn lấy một biến thể cụ thể, các gen/bảng điểm/Exons liên kết với biến thể, tất cả các bảng điểm của các gen, tất cả các gen & Exons của bảng điểm, và tất cả các bảng điểm của Exons.

Vấn đề

Khi tôi làm một truy vấn cho ở trên, nó hoạt động ngoại trừ các Bảng điểm cho các gen không lấy, Bảng điểm duy nhất của Exon là lấy. Tôi cho rằng điều này là do thuộc tính - gen.transcripts và exon.transcripts - chia sẻ cùng một tên.

Những gì tôi đã cố gắng

Truy vấn chính, trong một PagingAndSortingRepository, dưới

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

Tôi đã thử tham gia genomicFeature hai lần, một lần cho gen và một lần cho Bảng điểm & exon, nhưng điều này không hiệu quả.

Tôi đã thử chỉ chọn Gen (WHERE TYPE(gf) = Gene), nhưng nhìn vào truy vấn mà nó tạo ra, nó vẫn chỉ tham gia Bảng điểm của Exon và sau đó trả về các Gen.

+0

cố gắng thực hiện theo hai bước ... – aurelius

+0

bạn đã thử với 'JOIN FETCH' thay vì' LEFT JOIN FETCH' chưa? – Syl

Trả lời

0

Tôi không thử bản thân mình nhưng có thể với bí danh trên mệnh đề tìm nạp có thể giúp Hibernate phân biệt trường?

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

Tôi đã tìm ra. Nó chỉ hoạt động. Tôi đã có một lỗi cú pháp trong HQL của tôi.

Khi phân lớp phân biệt có thuộc tính/cột không nằm trong lớp gốc, tất cả các thuộc tính của tất cả các lớp con phân biệt có thể truy nhập trong HQL khi sử dụng lớp gốc trong câu lệnh FROM.

Các vấn đề liên quan