السبات الكثير من الاستعلام HQL، عند الانضمام الداخلي جلب خاصية غير مرتبط

StackOverflow https://stackoverflow.com/questions/1237346

سؤال

لدي جمعية متعددة إلى واحدة تم إعدادها مثل هذا، في HBM.xml:

<many-to-one name="gigVenue"
class="blah.blah.xxx" fetch="select"
lazy="no-proxy" not-null="true" >
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" />
</many-to-one>

وأنا أستخدم الأجهزة للقيام بتحميل كسول حقيقي.

ولكن عندما أقوم بتشغيل استعلام HQL مع جلب Inner للانضمام إلى الجدول الآخر، فإن الخاصية التي يجب أن تحتوي على الكائن الذي هو قيمة الجدول الأخرى، يتم تركه كافية. على الرغم من أنني أستطيع أن أرى كائن قيمة الجدول الأخرى التي يتم إنشاؤها بواسطة السبات.

هل لدى أي شخص أي نظرة ثاقبة في هذه المشكلة؟

تحديث:

from Gig g inner join fetch g.gigVenue gv where g.artistId = :artistId and  (g.territoryId = -1 or g.territoryId = :territoryId) order by g.gigDatetime desc

<set name="gigs" inverse="true" lazy="true" table="DSP_GIG" fetch="select">
<key>
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" />
</key>
<one-to-many class="blah.blah.Gig" />
</set>
هل كانت مفيدة؟

المحلول

نظرا لأنك تستخدم أداة رمز البايت بدلا من الجمعيات، فإن الجمعيات (لماذا؟) تحتاج إلى تحديد "جلب جميع الخصائص" في استفسارك:

from Gig g fetch all properties ... 

التفاصيل هنا

تحديث: لك gigVenue التعيين هو الإعداد lazy ل no-proxy. وبعد ما يعنيه ذلك هو أن الممتلكات ستكون فارغة حتى يتم الوصول إليها لأول مرة عبر طريقة Getter. يتم ذلك باستخدام أدوات رمز البايت وليس شيئا يستخدم عادة. باستخدام HQL. join fetch لن تملك هذه الممتلكات؛ يجب عليك تحديد صراحة fetch all properties كما وصفت أعلاه.

النظر في الإعداد lazy="proxy" بدلا من ذلك (هذا في الواقع الافتراضي لعدة إلى واحد)، ستقوم بتهيئة ممتلكاتك ككائن وكيل يحتوي على gigVenue معرف أثناء الاختيار الأولي، ثم استرداد الكيان الفعلي بمجرد الوصول إلى أحد GigVenueطرق. استخدام join fetch في HQL سوف تعمل أيضا في هذه الحالة، جلب كامل GigVenue مثيل أثناء الاختيار الأولي.

في تلك المذكرة، الإعداد fetch="select" هو أيضا مشكوك فيه من المرجح أن تكون أفضل حالا في تركها في الافتراضي join الإعداد لتمكين استخدام ينضم إلى الخارج لجلب.

نصائح أخرى

لا يؤثر الأجهزة حقا على الاستفسارات وكيف يعملون. لماذا بالضبط تفعل الجلب في الاستعلام؟ هل تحاول تسريع الأمور؟

وأيضا سؤال صغير، فقط في حالة، كيف حالك أعرف القيمة فارغة؟ هل هذا عبر مصحح جافا أو هو أنه من خلال استدعاء طريقة "الحصول" في الواقع؟ مع الأجهزة، سيكون الحقل عادة ما تكون فارغة، حتى تسأل في الواقع عن الحقل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top