sorgu katılma getirme ile belirtildi, ancak getirilen ilişkilendirmenin sahibi seçilen listesinde yoktu


83

İki kimlik sütunu seçiyorum ancak belirtilen hatayı alıyorum:

org.hibernate.QueryException: **query specified join fetching, but the owner of the fetched association was not present in the select list** 

[FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=r,role=null,tableName=REVISIONS,tableAlias=revision1_,origin=ENTITY_CHANGED_IN_REVISION entitychan0_,columns={entitychan0_.REV_ID ,className=ru.csbi.registry.domain.envers.Revision}}] [ select ec.id as entityChangeId, r.id as revisionId from ru.csbi.registry.domain.envers.EntityChange as ec  inner join fetch ec.revision as r  where ec.groupEntityId = :groupEntityId and ec.groupName = :groupName  and r.timestamp < :entityDateFrom  and r.timestamp > :entityDateTo  and (        ec.revisionType in (0, 5, 1, 4, 2 )       and not ( ec.otherGroupEntityModified = false and ec.thisGroupEntityModified = true and ec.rowDataModified = false and ec.collectionOfNotGroupEntityModified = false   )      )  group by ec.id, r.id  having count(*) > :start order by r.id desc]

Bazı kodlar:

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " +
            " inner join fetch ec.revision as r " +
            " where ec.groupEntityId = :groupEntityId" +
            " and ec.groupName = :groupName " +
            " and r.timestamp < :entityDateFrom " +
            " and r.timestamp > :entityDateTo " +
            " and ( " +
            "       ec.revisionType in (" + 
                        RevisionType.ADD.getRepresentation() + ", " + 
                        RevisionType.ONLY_DATA_PROPERTY_MOD.getRepresentation() + ", " +
                        RevisionType.BOTH_COLLECTION_AND_PROPERTY_MOD.getRepresentation() + ", " +
                        RevisionType.ONLY_COLLECTION_PROPERTY_MOD.getRepresentation() + ", " +
                        RevisionType.DEL.getRepresentation() +
                    " ) " +
            "     and not ( "+
                    "ec.otherGroupEntityModified = false and " +
                    "ec.thisGroupEntityModified = true and " +
                    "ec.rowDataModified = false and " +
                    "ec.collectionOfNotGroupEntityModified = false " +
                "  ) " +
            "     ) " +
            " group by ec.id, r.id " +
            " having count(*) > :start" +
            " order by r.id desc";

Hatayı nasıl düzeltebilirim ve neyi yanlış yapıyorum?


6
Bu sorunun gelecekteki arayışında olanlar için, benim durumumda, tembel olmayan bir niteliğe katılıyordum. Birleştirme cümlesini kaldırdığımda çözüldü.
merveotesi

2
Sanırım sizin durumunuzda sorun, tüm varlığı (EntityChange) değil, yalnızca birkaç sütunu seçmenizdir. Fetch yan tümcesi, yalnızca kök varlık seçilmişse ve eşlenmiş bir koleksiyonun / yetkinin katılarak doldurulmasını istiyorsanız anlamlıdır.
andy

Yanıtlar:


117

joinBunun yerine normal kullanın join fetch(bu arada, innervarsayılan olarak):

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " + 
        " join ec.revision as r " + ...

Hata mesajının size söylediği gibi, join fetchburada bir anlam ifade etmiyor, çünkü koleksiyonun istekli yüklenmesini zorunlu kılan bir performans ipucu.


4
Sadece açıklığa kavuşturmak için, join fetchyalnızca koleksiyonları değil, @ManyToOne ile açıklama eklenmiş bir alan gibi bir ilişkinin istekli yüklenmesini zorlamak için de kullanılabilir.
Robert Hunt

53
Hm .. Benzer bir sorunla karşı karşıyayım, ancak n + 1 sorununu önlemek için birleştirme getirme işlemi yapmam gerekiyor
Zhenya

4
@levgen, sorgunuzun ayrıntılarını bilmiyorum, ancak sayma sorgusunun hiç "getirme" içermemesi gerektiğini unutmayın. codingexplained.com/coding/java/spring-framework/…
gülümse

4
@levgen Bir kodu görmeden size yardımcı olmak zordur, ancak @Queryek açıklamalı Spring Data kullanırsanız , o zaman getirme ve sayma için ayrı sorgular belirtebilirsiniz: bu soruya bakın (Spring-Data FETCH JOIN with Paging çalışmıyor) detaylar için.
naXa

2
"Getir" i kaldırmak beni N + 1 sorununa götürdü ve uygulamamdaki her şeyin takılmasına neden oldu. Bu çözümü kimseye tavsiye etmem.
Alkis Mavridis

20

Birleştirme getirmesine ihtiyacınız olduğundan, getirmenin kaldırılması ihtiyacınızı karşılamayacaktır.

Bunun yerine yapmanız gereken, onunla birlikte bir sayma sorgusu belirtmektir.

Sonucu sayfalandırdığınızı varsayarsak, aşağıda id'yi param olarak alan ve belirttiğiniz soruna neden olacak jpa sorgusu yer alır ve ikinci sorgu, buna count sorgusu ekleyerek bunu çözer.

Not: fk_fieldtabloA'daki bire çok rln'ye sahip özniteliktir. Sayım sorgusu birleştirme getirmesini kullanmaz.

@Query(value = "from TableA a LEFT JOIN FETCH a.fk_field where a.id = :id") 

@Query(value = "from TableA a LEFT JOIN FETCH a.fk_field where a.id = :id", 
  countQuery = " select  count(a) from TableA a left join a.fk_field where a.id = :id")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.