تنفيذ "عضو" الاستعلام ضد "حقول" ElementCollection "في JP-QL (JPA 2.0)
-
20-09-2019 - |
سؤال
هل من الممكن تشغيل استعلام "عضو" ضد المصفوفات الترابطية؟ إذا كان الأمر كذلك ، كيف يبدو بناء الجملة؟ الحل الواضح هو استفسار أصلي ، لكن هذا يوضح إلى حد كبير مع كل الوصلات وما شابه. أرغب في اختبار وجود كائن داخل مجموعة مفاتيح الخريطة أو مجموعة القيمة أو مجموعة الإدخال. ربما شيء مثل ما يلي:
SELECT p FROM Person p WHERE 'home' MEMBER OF p.phoneNumbers.keySet
SELECT p FROM Person p WHERE '867-5309' MEMBER OF p.phoneNumbers.values
SELECT p FROM Person p WHERE {'home' -> '867-5309'} MEMBER OF p.phoneNumbers
قد يكون مدونة المزود العادلة أكثر من اللازم لطلبها ؛ هل يدعم Eclipselink هذا؟
المحلول
JPQL لديه وظيفة اسمها index()
وهو مفيد للحصول على الفهرس في @OrderColumn
قائمة. وكما قلت نفسك ، تسمى الخرائط أيضًا المصفوفات الترابطية ومفاتيح الخريطة مع مؤشرات الصفيف. لذلك لا شيء يمنع index()
من إعادة مفتاح إدخال الخريطة.
هذا الاستعلام يعمل بشكل مثالي على السبات:
SELECT p FROM Person p, in (p.phoneNumbers) number
WHERE number = '867-5309' AND index(number) = 'home'
نصائح أخرى
يجب أن تعمل:
SELECT p FROM Person p
WHERE (select count(*) from p.phoneNumbers where name='home' and value='867-5309') > 0
الاستعلام التالي يعمل بالنسبة لي:
select model from AnsOutboxMsg model
left join fetch model.updateEntity upde
left join fetch upde.update upd
left join fetch model.ansMessage msg
left join fetch msg.template msgt
left join fetch msg.ansAction act
left join fetch act.ansRule rl
left join fetch rl.app app
where (select count(*) from model.contextMap where name = 'fltClient' and value = 'XXX') > 0 and model.status = 'sent' and app.id = 'SPN_TICKETS' and msgt.name = 'Client' order by model.modifDate DESC, model.id ASC
المواصفات JPA (2) لا تحدد بناء الجملة الخاص بها لـ خريطة استخدم في عضو (كنت تشير أصلاً إلى المصفوفات ، لكنني لا أرى الأهمية إذا كان لديك خريطة) ، وبالتالي لا يمكنك الاعتماد على أي بناء جملة صالح لجميع تطبيقات JPA. نظرًا لأن JPQL لا يدعم أساليب Java مثل KeySet ، فأنا لا أستطيع رؤية تلك المرجح. أكثر من المحتمل أن يدعم الشيك فقط لوجود قيمة ، مثل
'867-5309' MEMBER OF p.phoneNumbers
كمرجع ، في JDOQL ، ستفعل
p.phoneNumbers.containsKey('home');
p.phoneNumbers.containsValue('867-5309');