تنفيذ "عضو" الاستعلام ضد "حقول" ElementCollection "في JP-QL (JPA 2.0)

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

سؤال

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

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');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top