السبات الكثير من الاستعلام HQL، عند الانضمام الداخلي جلب خاصية غير مرتبط
-
11-09-2019 - |
سؤال
لدي جمعية متعددة إلى واحدة تم إعدادها مثل هذا، في 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
الإعداد لتمكين استخدام ينضم إلى الخارج لجلب.
نصائح أخرى
لا يؤثر الأجهزة حقا على الاستفسارات وكيف يعملون. لماذا بالضبط تفعل الجلب في الاستعلام؟ هل تحاول تسريع الأمور؟
وأيضا سؤال صغير، فقط في حالة، كيف حالك أعرف القيمة فارغة؟ هل هذا عبر مصحح جافا أو هو أنه من خلال استدعاء طريقة "الحصول" في الواقع؟ مع الأجهزة، سيكون الحقل عادة ما تكون فارغة، حتى تسأل في الواقع عن الحقل.