سؤال

لدي علاقة فردية حيث أستخدم cascadetype.persist. لقد قام هذا بمرور الوقت ببناء كمية هائلة من سجلات الأطفال التي لم يتم حذفها ، إلى هذا التمديد الذي ينعكس في الأداء. الآن أود إضافة بعض التعليمات البرمجية التي تنظف قاعدة البيانات التي تزيل جميع سجلات الأطفال التي لم يتم الإشارة إليها من قبل أحد الوالدين. في الوقت الحالي ، نتحدث عن سجلات 400K+ ، في حاجة إلى تشغيل الرمز على جميع عمليات تثبيت العملاء فقط للتأكد من أنها لا تواجه نفس المشكلة.

أعتقد أن أفضل حل هو تشغيل استعلام مسمى (لأننا ندعم قواعد بيانات) يحذف السجلات اللازمة ، وهذا هو المكان الذي أواجه فيه المشكلات ، لأنه كيف يمكنني كتابته في JPQL؟

يمكن تعريف النتيجة التي أريدها مثل عبارة SQL التالية ، والتي لا تعمل للأسف على MySQL.

DELETE FROM child c1
WHERE c1.pk NOT IN (SELECT DISTINCT p.pk FROM child c2
JOIN parent p ON p.child = c2.pk);
هل كانت مفيدة؟

المحلول

DELETE FROM child c
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top