Benim bir meslektaşım (görünüşte geçersiz) JPQL sorgusu aşağıdaki etti:JPA 2.0 JPQL'de, bir YENİ nesneyi döndürdüğünde, FETCH JOIN'leri nasıl kullanabilir?
SELECT NEW com.foobar.jpa.DonationAllocationDTOEntity(a.id, a.campaign, a.campAppeal, a.campDivision, a.divisionFund)
FROM DonationAllocation a JOIN a.donation d JOIN a.allocationType t
JOIN FETCH a.campaign
WHERE d.id = :donationId
AND (t.code = 'Pledge' OR t.code = 'MatchingPledge')
Bir Campaign
varlık ile DonationAllocation
'ın göre bu ilişki bire olduğu (bu mesajın devamında için) dikkati çekiyor, ve FetchType.LAZY
olarak işaretlenmiştir. Meslektaşımın bu sorgunun amacı, (diğer şeylerin yanı sıra) a.campaign
'un "şişirilmiş" (hevesle getirilmiş) olduğunu garanti etmektir. Seçim listesi yalnızca NEW DonationAllocationDTOEntity()
içerdiğinden
query specified join fetching, but the owner of the fetched association was not present in the select list
Bu, mantıklı ve bölüm:
Hazırda (birkaçının besbelli sadece bir JPA uygulaması), bu sorgu ile karşılaştığında, diyor JPA 2.0 belirtiminin 4.4.5.3'ü:
FETCH JOIN yan tümcesinin sağ tarafından başvurulan ilişkilendirme Bir kuruluştan başvurulan bir ilişki veya öğe koleksiyonu veya sorgunun sonucu olarak döndürülen gömülebilir olabilir.
Yani "terimi bir sonucu olarak döndürülür antite gömülebilir" olduğundan (o bir DTO NEW
operatörü kullanılarak oluşturulan), bir referans artır FETCH için olası bir ilişki olduğunu aşağıdaki ve dolayısıyla bu sorgu geçersiz.
Bu sınırlama dikkate alındığında, bu durumda, bir JPQL sorgusu, yapıcı ifadesine girilen a.campaign
- hevesle getirilecek şekilde nasıl oluşturulur?
Teşekkür ederiz. 'DonationAllocation' şu anda çok fazla sayıda "EAGER" ilişkisi olan bir * büyük * nesnesidir. İş arkadaşımın sadece belirli kısımlarını geri çekmeye çalıştığına inanıyorum. Öyle ki, bu ilişkilerden biri, aslında bu sorguda hevesle yüklenmesini istemektedir. Bu yeni bilgi ile cevabınızı değiştirir mi? –
Evet, cevabımı görün. Fakat eğer varlığın yüklenmesi böyle bir problemse, bu sadece istekli derneklerinin tembel olması gerektiği anlamına gelir. Her şeyi tembelleştirmeyi tercih ederim. –