क्वेरी निर्दिष्ट शामिल हो रही है, लेकिन भ्रूण एसोसिएशन का मालिक चुनिंदा सूची में मौजूद नहीं था


83

मैं दो आईडी कॉलम चुन रहा हूं, लेकिन त्रुटि निर्दिष्ट करें:

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]

कुछ कोड:

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";

त्रुटि कैसे ठीक करें और मैं क्या गलत कर रहा हूं?


6
इस सवाल के भविष्य के खोजकर्ताओं के लिए, मेरी स्थिति में, मैं एक गैर आलसी विशेषता में शामिल हो रहा था। जब मैं ज्वाइनिंग क्लॉज हटाता हूं तो यह हल हो गया था।
मूरोट्सोटी

2
मुझे लगता है कि आपके मामले में समस्या यह है कि आप पूरी इकाई (EntityChange) का चयन नहीं करते हैं, लेकिन केवल कुछ कॉलमों का। फ़ॉच क्लॉज़ केवल तभी समझ में आता है, यदि मूल निकाय का चयन किया जाता है और आप चाहते हैं कि एक मैप्ड संग्रह / एंट्री इसमें शामिल होकर भरा जाए।
andy

जवाबों:


118

joinइसके बजाय नियमित उपयोग करें join fetch(वैसे, यह innerडिफ़ॉल्ट रूप से है):

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

जैसा कि त्रुटि संदेश आपको बताता है, join fetchयहां कोई मतलब नहीं है, क्योंकि यह एक प्रदर्शन संकेत है जो संग्रह के उत्सुक लोडिंग को मजबूर करता है।


4
बस स्पष्ट करने के लिए, join fetch@ManyToOne के साथ एनोटेट किए गए फ़ील्ड जैसे एसोसिएशन के उत्सुक लोडिंग को मजबूर करने के लिए भी इस्तेमाल किया जा सकता है और न केवल संग्रह।
रॉबर्ट हंट

52
हम्म .. मैं इसी तरह के एक मुद्दे का सामना कर रहा हूं, लेकिन मुझे n + 1 समस्या से बचने के लिए ज्वाइन करने की जरूरत है
झेन्या

4
@levgen, मुझे आपकी क्वेरी का विवरण नहीं पता है लेकिन, ध्यान रखें कि गणना क्वेरी में "भ्रूण" बिल्कुल नहीं होना चाहिए। codingexplained.com/coding/java/spring-framework/…
मुस्कान

4
@levgen कोड देखे बिना आपकी सहायता करना कठिन है, लेकिन अगर ऐसा होता है कि आप @Queryएनोटेशन के साथ स्प्रिंग डेटा का उपयोग करते हैं, तो आप अलग-अलग प्रश्नों को निर्दिष्ट कर सकते हैं और गणना के लिए निर्दिष्ट कर सकते हैं: यह प्रश्न देखें (स्प्रिंग-डेटा FETCH JOIN with Paging काम नहीं कर रहा है) ब्योरा हेतु।
naXa

2
"लाने" ने मुझे N + 1 समस्या के लिए प्रेरित किया और मेरे आवेदन में सब कुछ लटका दिया। किसी को भी इस समाधान की सिफारिश नहीं करेंगे।
अलकिस मावरिदिस

20

जैसा कि आपको शामिल होने की आवश्यकता है, भ्रूण को निकालना आपकी आवश्यकता को पूरा नहीं करेगा।

इसके बजाय आपको क्या करना चाहिए, इसके साथ एक गणना क्वेरी निर्दिष्ट करें।

यह मानते हुए कि आप परिणाम को पृष्ठांकित कर रहे हैं, नीचे jpa क्वेरी है जो id को परम के रूप में लेती है और आपके द्वारा निर्दिष्ट समस्या का कारण बनेगी और दूसरी क्वेरी इसे गणना क्वेरी जोड़कर हल करती है।

नोट: fk_fieldटेबलए में विशेषता है जिसमें एक से कई आरएलएन हैं। गिनती क्वेरी में शामिल होने का उपयोग नहीं किया जाता है।

@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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.